Java 时间日期详细介绍及实例

Java 时间日期

概要:

  程序就是输入——>处理——>输出。对数据的处理是程序员需要着重注意的地方,快速、高效的对数据进行处理时我们的追求。其中,时间日期的处理又尤为重要和平凡,此次,我将把Java中的时间日期处理方式进行简单的解析,为自己以后的学习做一个备忘,也为初学者做一个借鉴。

  时间,英文Time;日期,英文Date;日历,英文Calendar。Java中注重语义化,也是用以上的名称对时间日期函数和相关类进行命名。

  我们将以Java自带的时间日期类和其中的处理函数进行分析。

一、与时间日期有关的类。

  java.util.Date。实现类,其对象具有时间、日期组件。

  java.util.Calendar。抽象类,其对象具有时间、日期组件。

  java.sql.Date。实现类,其对象具有日期组件。

  java.sql.Time。实现类,其对象具有时间组件。

  java.sql.Timestamp。实现类,其对象具有时间日期组件。

  java.text.DateFormat。抽象类,其对象格式化时间日期。

  java.text.DateFormatSymbols。实现类,其对象为格式化时间日期提供参数。

  (sun.util.*canlender*.*。System。Local。TimeZone等)

  由于jdk的安装并没有给出全部源码,推荐大家获取jdk全部源码:jdk6u23-src.rar jdk7u4-src.rar。

二、类之间的关系。

  我们通过图解和部分jdk源代码来说明。 

  

  (上图有几处错误,Calendar拼写错误。)

  以上的图列出了部分常用的类。我们一般会使用的类java.util.Date、java.util.Calendar、java.sql.Timestamp、java.text.DateFormat进行时间日期操作,因为他们有完全的时间日期组件和全面的格式化功能。

  值得注意的是:java.sql.Date没有时间组件!而java.sql.Time没有日期组件!再次提醒。什么意思呢?大家请看下面的代码:

public static void main(String[] args) {
     /*
     * 以下代码用于向大家展示各个时间日期类对象的包含组件。
     */
     java.sql.Date sqlDate = new java.sql.Date(System.currentTimeMillis());
     System.out.println(sqlDate.toString()); // 输出结果:2012-09-01
     java.sql.Time sqlTime = new java.sql.Time(System.currentTimeMillis());
     System.out.println(sqlTime.toString()); // 输出结果:12:35:11
     java.sql.Timestamp sqlTimestamp = new java.sql.Timestamp(System.currentTimeMillis());
     System.out.println(sqlTimestamp.toString()); // 输出结果:2012-09-01 12:36:33.544
     java.util.Date utilDate = new java.util.Date(System.currentTimeMillis());
     System.out.println(utilDate.toString()); // 输出结果:Sat Sep 01 12:37:34 CST 2012
     java.util.Calendar cl = java.util.Calendar.getInstance();
     System.out.println(cl.getTime().toString()); // 输出结果:Sat Sep 01 12:39:51 CST 2012
   }

  可以看到:java.util.Date、java.util.Calendar、java.sql.Timestamp具有的时间日期组件(而且他们具有无参构造方法),java.sql.Date和java.sql.Time只有时间或日期组件。

  为了证实以上言论,我将部分jdk源码贴出来供大家参考。

  java.sql.Date源代码:

 package java.sql;

 public class Date extends java.util.Date {

   // 省略部分代码……

   // Override all the time operations inherited from java.util.Date;

  /**
   * This method is deprecated and should not be used because SQL Date
   * values do not have a time component.
   *
   * @deprecated
   * @exception java.lang.IllegalArgumentException if this method is invoked
   * @see #setHours
   */
   public int getHours() {
     throw new java.lang.IllegalArgumentException();
   }

  /**
   * This method is deprecated and should not be used because SQL Date
   * values do not have a time component.
   *
   * @deprecated
   * @exception java.lang.IllegalArgumentException if this method is invoked
   * @see #setMinutes
   */
   public int getMinutes() {
     throw new java.lang.IllegalArgumentException();
   }

  /**
   * This method is deprecated and should not be used because SQL Date
   * values do not have a time component.
   *
  * @deprecated
   * @exception java.lang.IllegalArgumentException if this method is invoked
   * @see #setSeconds
   */
   public int getSeconds() {
     throw new java.lang.IllegalArgumentException();
   }

  /**
   * This method is deprecated and should not be used because SQL Date
   * values do not have a time component.
   *
   * @deprecated
   * @exception java.lang.IllegalArgumentException if this method is invoked
   * @see #getHours
   */
   public void setHours(int i) {
     throw new java.lang.IllegalArgumentException();
   }

  /**
  * This method is deprecated and should not be used because SQL Date
   * values do not have a time component.
  *
   * @deprecated
  * @exception java.lang.IllegalArgumentException if this method is invoked
  * @see #getMinutes
  */
  public void setMinutes(int i) {
    throw new java.lang.IllegalArgumentException();
   }

 /**
   * This method is deprecated and should not be used because SQL Date
  * values do not have a time component.
  *
   * @deprecated
   * @exception java.lang.IllegalArgumentException if this method is invoked
   * @see #getSeconds
   */
   public void setSeconds(int i) {
    throw new java.lang.IllegalArgumentException();
  }

  /**
   * Private serial version unique ID to ensure serialization
   * compatibility.
   */
   static final long serialVersionUID = 1511598038487230103L;
 }

  java.sql.Time源代码:

// 省略部分源代码……

  /**
  * This method is deprecated and should not be used because SQL <code>TIME</code>
  * values do not have a year component.
  *
  * @deprecated
  * @exception java.lang.IllegalArgumentException if this
  *      method is invoked
  * @see #setYear
  */
  @Deprecated
  public int getYear() {
    throw new java.lang.IllegalArgumentException();
  }

  /**
  * This method is deprecated and should not be used because SQL <code>TIME</code>
  * values do not have a month component.
  *
  * @deprecated
  * @exception java.lang.IllegalArgumentException if this
  *      method is invoked
  * @see #setMonth
  */
  @Deprecated
  public int getMonth() {
    throw new java.lang.IllegalArgumentException();
  }

  /**
  * This method is deprecated and should not be used because SQL <code>TIME</code>
  * values do not have a day component.
  *
  * @deprecated
  * @exception java.lang.IllegalArgumentException if this
  *      method is invoked
  */
  @Deprecated
  public int getDay() {
    throw new java.lang.IllegalArgumentException();
  }

  /**
  * This method is deprecated and should not be used because SQL <code>TIME</code>
  * values do not have a date component.
  *
  * @deprecated
  * @exception java.lang.IllegalArgumentException if this
  *      method is invoked
  * @see #setDate
  */
  @Deprecated
  public int getDate() {
    throw new java.lang.IllegalArgumentException();
  }

  /**
  * This method is deprecated and should not be used because SQL <code>TIME</code>
  * values do not have a year component.
  *
  * @deprecated
  * @exception java.lang.IllegalArgumentException if this
  *      method is invoked
  * @see #getYear
  */
  @Deprecated
  public void setYear(int i) {
    throw new java.lang.IllegalArgumentException();
  }

  /**
  * This method is deprecated and should not be used because SQL <code>TIME</code>
  * values do not have a month component.
  *
  * @deprecated
  * @exception java.lang.IllegalArgumentException if this
  *      method is invoked
  * @see #getMonth
  */
  @Deprecated
  public void setMonth(int i) {
    throw new java.lang.IllegalArgumentException();
  }

  /**
  * This method is deprecated and should not be used because SQL <code>TIME</code>
  * values do not have a date component.
  *
  * @deprecated
  * @exception java.lang.IllegalArgumentException if this
  *      method is invoked
  * @see #getDate
  */
  @Deprecated
  public void setDate(int i) {
    throw new java.lang.IllegalArgumentException();
  }

  /**
  * Private serial version unique ID to ensure serialization
  * compatibility.
  */
  static final long serialVersionUID = 8397324403548013681L;
}

  从上面的代码可以看出:java.sql.Date和java.sql.Time确实是不具有完整组件的!

  我们再次利用代码来说明:

public static void main(String[] args) {
    /*
     * 以下代码用于向大家展示各个时间日期类对象的包含组件。
     */
    java.sql.Date sqlDate = new java.sql.Date(System.currentTimeMillis());
    System.out.println(sqlDate.toString()); // 输出结果:2012-09-01
    java.sql.Time sqlTime = new java.sql.Time(System.currentTimeMillis());
    System.out.println(sqlTime.toString()); // 输出结果:12:35:11
    java.sql.Timestamp sqlTimestamp = new java.sql.Timestamp(System.currentTimeMillis());
    System.out.println(sqlTimestamp.toString()); // 输出结果:2012-09-01 12:36:33.544
    java.util.Date utilDate = new java.util.Date(System.currentTimeMillis());
    System.out.println(utilDate.toString()); // 输出结果:Sat Sep 01 12:37:34 CST 2012
    java.util.Calendar cl = java.util.Calendar.getInstance();
    System.out.println(cl.getTime().toString()); // 输出结果:Sat Sep 01 12:39:51 CST 2012

    /*
     * 以下代码用于试验java.sql.Date和java.sql.Time是否具有完整组件。
     */
    System.out.println();
    try {
      System.out.println(sqlDate.getHours());
    } catch (Exception e) {
      System.out.println(e.getMessage()); // 输出 null
    }
    try {
      System.out.println(sqlTime.getDate());
    } catch (Exception e) {
      System.out.println(e.getMessage()); // 输出 null
    }
  }

  实验成功,所有给大家一个忠告:在进行数据库时间日期操作时,使用java.sql.Timestamp类。

  那么很简单,如果您需要在程序中进行完整的时间日期操作,推荐您使用java.util.Date+java.text.DateFormat。

  如果您需要进行复杂或深入的操作,您可以选择java.util.Calendar。有人说Calendar是Date的复杂版本,我觉得说得有一些道理。我们可以通过他们的依赖对象(通过源码文件中引入的外部类)来证实这个说法:

  java.util.Date:

package java.util;

import java.text.DateFormat;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.ObjectInputStream;
import java.lang.ref.SoftReference;
import sun.util.calendar.BaseCalendar;
import sun.util.calendar.CalendarDate;
import sun.util.calendar.CalendarSystem;
import sun.util.calendar.CalendarUtils;
import sun.util.calendar.Era;
import sun.util.calendar.Gregorian;
import sun.util.calendar.ZoneInfo;

  java.util.Calendar:

package java.util;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OptionalDataException;
import java.io.Serializable;
import java.security.AccessControlContext;
import java.security.AccessController;
import java.security.PermissionCollection;
import java.security.PrivilegedActionException;
import java.security.PrivilegedExceptionAction;
import java.security.ProtectionDomain;
import java.text.DateFormat;
import java.text.DateFormatSymbols;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import sun.util.BuddhistCalendar;
import sun.util.calendar.ZoneInfo;
import sun.util.resources.LocaleData;

  java.util.Date更多地用到了sun.util.*calendar*.*。而java.util.Calendar对他们的依赖则很少,并且Calendar中加入了更好的格式化功能等……(sun.util等源码安装jdk不会提供,我在顶部的下载连接中提供了)。

  其实说这么多都是废话。对大家有用的东西无非只有两点:一是怎样获得时间日期,二是怎样按照自定义格式显示。

  现在我才来讲解以上两点:

    大家可以通过java.util.Date date = new java.util.Date()或者java.util.Date date = java.util.Calendar.getInstance().getTime()获得java.util.Date对象。至少我推荐这样做,和数据库打交道的话就用java.sql.Timestamp。

    (而实际上jdk是不推荐我们使用java.util.Date对象来进行时间日期获取的,我们从java.util.Date类方法注释可以看到,基本所有的方法都有@Deprecated注解,而方法注释大意则是"从JDK1.1开始,我们推荐您使用Calendar的静态成员和对象成员来对时间日期进行操作"。我觉得其中的考虑可能有为了避免歧义吧,毕竟Date的意思是日期)

    大家可以通过java.text.DateFormat或者他的直接实现类java.text.SimpleDateFormat来实现时间日期的格式化。

    下面的代码会给大家展示如何格式化时间日期:

public static void main(String[] args) {
    /*
     * 以下代码用于向大家展示各个时间日期类对象的包含组件。
     */
    java.sql.Date sqlDate = new java.sql.Date(System.currentTimeMillis());
    System.out.println(sqlDate.toString()); // 输出结果:2012-09-01
    java.sql.Time sqlTime = new java.sql.Time(System.currentTimeMillis());
    System.out.println(sqlTime.toString()); // 输出结果:12:35:11
    java.sql.Timestamp sqlTimestamp = new java.sql.Timestamp(System.currentTimeMillis());
    System.out.println(sqlTimestamp.toString()); // 输出结果:2012-09-01 12:36:33.544
    java.util.Date utilDate = new java.util.Date(System.currentTimeMillis());
    System.out.println(utilDate.toString()); // 输出结果:Sat Sep 01 12:37:34 CST 2012
    java.util.Calendar cl = java.util.Calendar.getInstance();
    System.out.println(cl.getTime().toString()); // 输出结果:Sat Sep 01 12:39:51 CST 2012

    /*
     * 以下代码用于试验java.sql.Date和java.sql.Time是否具有完整组件。
     */
    System.out.println();
    try {
      System.out.println(sqlDate.getHours());
    } catch (Exception e) {
      System.out.println(e.getMessage()); // 输出 null
    }
    try {
      System.out.println(sqlTime.getDate());
    } catch (Exception e) {
      System.out.println(e.getMessage()); // 输出 null
    }

    /*
     * 下面的代码给大家展示时间日期的格式化。
     */
    System.out.println();
    java.text.DateFormat dateFormat = java.text.SimpleDateFormat.getInstance();
    // java.util.Date原本的格式
    System.out.println(utilDate.toString()); // 输出:Sat Sep 01 13:16:13 CST 2012
    // java.util.Date格式化后的格式
    System.out.println(dateFormat.format(sqlDate)); // 输出:12-9-1 下午1:16
    System.out.println();
    // 很多时候以上的结果并不是我们希望的,我们希望更加自由、更见简单的操作方式
    // 此时,java.text.SimpleDateFormat就成了我们的不二选择
    // SimpleDateFormat提供了无参和自定义格式参数的构造方法使我们能够轻松地实现自定义格式化
    java.text.SimpleDateFormat simpleDateFormat = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss a");
    System.out.println(simpleDateFormat.format(sqlDate)); // 输出:2012-09-01 13:20:41 下午
  }

  (我不是为了占篇幅才贴上来重复代码的哦^_^)

  java.text.SimpleDateFormat的format方法使用参数提供了强大的格式化功能(另外,值得一提的是:它的parse方法也提供了强大的字符串转化为Date的功能)。您可以参照以下表格进行选择:

  

  (上图有一出错误:m和mm中,前者表示当分钟数小于10会只占用一个输出位,即输出0-9而不会输出00-09)

  好了,大家赶紧利用jdk进行时间日期的操作处理吧!

感谢阅读,希望能帮助到大家,谢谢大家,对本站的支持!

(0)

相关推荐

  • Java中的日期和时间类以及Calendar类用法详解

    Java日期和时间类简介 Java 的日期和时间类位于 java.util 包中.利用日期时间类提供的方法,可以获取当前的日期和时间,创建日期和时间参数,计算和比较时间. Date 类 Date 类是 Java 中的日期时间类,其构造方法比较多,下面是常用的两个: Date():使用当前的日期和时间初始化一个对象. Date(long millisec):从1970年01月01日00时(格林威治时间)开始以毫秒计算时间,计算 millisec 毫秒.如果运行 Java 程序的本地时区是北京时区(

  • Java日期时间使用方法汇总

    一.Java中的日期概述 日期在Java中是一块非常复杂的内容,对于一个日期在不同的语言国别环境中,日期的国际化,日期和时间之间的转换,日期的加减运算,日期的展示格式都是非常复杂的问题. 在Java中,操作日期主要涉及到一下几个类:  1.java.util.Date         类 Date 表示特定的瞬间,精确到毫秒.从 JDK 1.1 开始,应该使用 Calendar 类实现日期和时间字段之间转换,使用 DateFormat 类来格式化和分析日期字符串.Date 中的把日期解释为年.月

  • java获取当前时间和前一天日期(实现代码)

    废话不多说,上代码 复制代码 代码如下: String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; Date dNow = new Date();   //当前时间Date dBefore = new Date(); Calendar calendar = Calendar.getInstanc

  • java分割日期时间段代码

    本文实例为大家分享了java切割日期时间段代码,供大家参考,具体内容如下 /** * @author dy * @since 2016-09-18 & JDK 1.8.0_91 */ public class DateCalculate { static Logger logger = LoggerFactory.getLogger(DateCalculate.class); /** * 切割时间段 * * @param dateType 交易类型 M/D/H/N -->每月/每天/每小时/

  • java获取当前日期和时间的二种方法分享

    有两种方法:方法一:用java.util.Date类来实现,并结合java.text.DateFormat类来实现时间的格式化,看下面代码: 复制代码 代码如下: import java.util.*;import java.text.*;//以下默认时间日期显示方式都是汉语语言方式//一般语言就默认汉语就可以了,时间日期的格式默认为MEDIUM风格,比如:2008-6-16 20:54:53//以下显示的日期时间都是再Date类的基础上的来的,还可以利用Calendar类来实现见类TestDa

  • java计算两个日期中间的时间

    java计算两个日期中间的时间 其中在数据库中有一个字段为datetime类型,想要计算两个日期之间过了多少天 多少小时 多少分钟. 思路为把时间换算为毫秒(与协调世界时 1970 年 1 月 1 日午夜之间的时间差(以毫秒为单位测量).然后利用毫秒的加减计算. 计算如下: public static String getDays(Date date){ Calendar cal=Calendar.getInstance(); cal.setTime(date); long oldTime=ca

  • Java处理日期时间的方法汇总

    一.java.util.Calendar介绍 Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR.MONTH.DAY_OF_MONTH.HOUR 等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法.瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000,格里高利历)的偏移量. 二.简单示例 // 通过格式化输出日期 java.text.SimpleDateFormat format

  • 学习Java中的日期和时间处理及Java日历小程序的编写

    Java 在 java.util 包中提供了 Date 类,这个类封装了当前的日期和时间. Date 类支持两种构造函数.第一个构造函数初始化对象的当前日期和时间. Date( ) 下面的构造函数接收一个参数等于自1970年1月1日午夜起已经过的毫秒数 Date(long millisec) 一旦有一个可用的日期对象,可以调用以下任何一种支持的方法使用时间: SN 方法和描述 1 boolean after(Date date) 如果调用Date对象包含或晚于指定的日期则返回true,否则,返回

  • PHP与Java对比学习日期时间函数

    废话少说先来看PHP中 date():格式化一个本地时间或者日期,当前时间 2016年5月13日 15:19:49 使用函数date(),输出当前是月份中的第几天,参数:String类型 d 例如:echo date("d"); 输出 13 使用函数date(),输出当前是星期中的第几天,参数:String类型 D或者 N 例如: echo date("D"); 输出 Fri echo date("N"); 输出 5 echo date(&quo

  • Java对日期Date类进行加减运算、年份加减月份加减、时间差等等

    实现代码一: import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; public class DateTestUtil { public static void main(String[] args) throws Exception { SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMdd"); String str=&

  • Java 8中日期和时间的处理方法

    Java 8新增了LocalDate和LocalTime接口,为什么要搞一套全新的处理日期和时间的API?因为旧的java.util.Date实在是太难用了. java.util.Date月份从0开始,一月是0,十二月是11,变态吧!java.time.LocalDate月份和星期都改成了enum,就不可能再用错了. java.util.Date和SimpleDateFormatter都不是线程安全的,而LocalDate和LocalTime和最基本的String一样,是不变类型,不但线程安全,

随机推荐