zoukankan      html  css  js  c++  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没有日期组件!再次提醒。什么意思呢?大家请看下面的代码:

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

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

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

      java.sql.Date源代码:

    复制代码
     1 package java.sql;
     2 
     3 
     4 public class Date extends java.util.Date {
     5 
     6     // 省略部分代码……
     7 
     8     // Override all the time operations inherited from java.util.Date;
     9 
    10    /**
    11     * This method is deprecated and should not be used because SQL Date
    12     * values do not have a time component.
    13     *
    14     * @deprecated
    15     * @exception java.lang.IllegalArgumentException if this method is invoked
    16     * @see #setHours
    17     */
    18     public int getHours() {
    19         throw new java.lang.IllegalArgumentException();
    20     }
    21 
    22    /**
    23     * This method is deprecated and should not be used because SQL Date
    24     * values do not have a time component.
    25     *
    26     * @deprecated
    27     * @exception java.lang.IllegalArgumentException if this method is invoked
    28     * @see #setMinutes
    29     */
    30     public int getMinutes() {
    31         throw new java.lang.IllegalArgumentException();
    32     }
    33 
    34    /**
    35     * This method is deprecated and should not be used because SQL Date
    36     * values do not have a time component.
    37     *
    38     * @deprecated
    39     * @exception java.lang.IllegalArgumentException if this method is invoked
    40     * @see #setSeconds
    41     */
    42     public int getSeconds() {
    43         throw new java.lang.IllegalArgumentException();
    44     }
    45 
    46    /**
    47     * This method is deprecated and should not be used because SQL Date
    48     * values do not have a time component.
    49     *
    50     * @deprecated
    51     * @exception java.lang.IllegalArgumentException if this method is invoked
    52     * @see #getHours
    53     */
    54     public void setHours(int i) {
    55         throw new java.lang.IllegalArgumentException();
    56     }
    57 
    58    /**
    59     * This method is deprecated and should not be used because SQL Date
    60     * values do not have a time component.
    61     *
    62     * @deprecated
    63     * @exception java.lang.IllegalArgumentException if this method is invoked
    64     * @see #getMinutes
    65     */
    66     public void setMinutes(int i) {
    67         throw new java.lang.IllegalArgumentException();
    68     }
    69 
    70    /**
    71     * This method is deprecated and should not be used because SQL Date
    72     * values do not have a time component.
    73     *
    74     * @deprecated
    75     * @exception java.lang.IllegalArgumentException if this method is invoked
    76     * @see #getSeconds
    77     */
    78     public void setSeconds(int i) {
    79         throw new java.lang.IllegalArgumentException();
    80     }
    81 
    82    /**
    83     * Private serial version unique ID to ensure serialization
    84     * compatibility.
    85     */
    86     static final long serialVersionUID = 1511598038487230103L;
    87 }
    复制代码

      java.sql.Time源代码:

    复制代码
      1     // 省略部分源代码……
      2 
      3    /**
      4     * This method is deprecated and should not be used because SQL <code>TIME</code>
      5     * values do not have a year component.
      6     *
      7     * @deprecated
      8     * @exception java.lang.IllegalArgumentException if this
      9     *           method is invoked
     10     * @see #setYear
     11     */
     12     @Deprecated
     13     public int getYear() {
     14         throw new java.lang.IllegalArgumentException();
     15     }
     16 
     17    /**
     18     * This method is deprecated and should not be used because SQL <code>TIME</code>
     19     * values do not have a month component.
     20     *
     21     * @deprecated
     22     * @exception java.lang.IllegalArgumentException if this
     23     *           method is invoked
     24     * @see #setMonth
     25     */
     26     @Deprecated
     27     public int getMonth() {
     28         throw new java.lang.IllegalArgumentException();
     29     }
     30 
     31    /**
     32     * This method is deprecated and should not be used because SQL <code>TIME</code>
     33     * values do not have a day component.
     34     *
     35     * @deprecated
     36     * @exception java.lang.IllegalArgumentException if this
     37     *           method is invoked
     38     */
     39     @Deprecated
     40     public int getDay() {
     41         throw new java.lang.IllegalArgumentException();
     42     }
     43 
     44    /**
     45     * This method is deprecated and should not be used because SQL <code>TIME</code>
     46     * values do not have a date component.
     47     *
     48     * @deprecated
     49     * @exception java.lang.IllegalArgumentException if this
     50     *           method is invoked
     51     * @see #setDate
     52     */
     53     @Deprecated
     54     public int getDate() {
     55         throw new java.lang.IllegalArgumentException();
     56     }
     57 
     58    /**
     59     * This method is deprecated and should not be used because SQL <code>TIME</code>
     60     * values do not have a year component.
     61     *
     62     * @deprecated
     63     * @exception java.lang.IllegalArgumentException if this
     64     *           method is invoked
     65     * @see #getYear
     66     */
     67     @Deprecated
     68     public void setYear(int i) {
     69         throw new java.lang.IllegalArgumentException();
     70     }
     71 
     72    /**
     73     * This method is deprecated and should not be used because SQL <code>TIME</code>
     74     * values do not have a month component.
     75     *
     76     * @deprecated
     77     * @exception java.lang.IllegalArgumentException if this
     78     *           method is invoked
     79     * @see #getMonth
     80     */
     81     @Deprecated
     82     public void setMonth(int i) {
     83         throw new java.lang.IllegalArgumentException();
     84     }
     85 
     86    /**
     87     * This method is deprecated and should not be used because SQL <code>TIME</code>
     88     * values do not have a date component.
     89     *
     90     * @deprecated
     91     * @exception java.lang.IllegalArgumentException if this
     92     *           method is invoked
     93     * @see #getDate
     94     */
     95     @Deprecated
     96     public void setDate(int i) {
     97         throw new java.lang.IllegalArgumentException();
     98     }
     99 
    100    /**
    101     * Private serial version unique ID to ensure serialization
    102     * compatibility.
    103     */
    104     static final long serialVersionUID = 8397324403548013681L;
    105 }
    复制代码

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

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

    复制代码
     1 public static void main(String[] args) {
     2         /*
     3          * 以下代码用于向大家展示各个时间日期类对象的包含组件。
     4          */
     5         java.sql.Date sqlDate = new java.sql.Date(System.currentTimeMillis());
     6         System.out.println(sqlDate.toString()); // 输出结果:2012-09-01
     7         java.sql.Time sqlTime = new java.sql.Time(System.currentTimeMillis());
     8         System.out.println(sqlTime.toString()); // 输出结果:12:35:11
     9         java.sql.Timestamp sqlTimestamp = new java.sql.Timestamp(System.currentTimeMillis());
    10         System.out.println(sqlTimestamp.toString()); // 输出结果:2012-09-01 12:36:33.544
    11         java.util.Date utilDate = new java.util.Date(System.currentTimeMillis());
    12         System.out.println(utilDate.toString()); // 输出结果:Sat Sep 01 12:37:34 CST 2012
    13         java.util.Calendar cl = java.util.Calendar.getInstance();
    14         System.out.println(cl.getTime().toString()); // 输出结果:Sat Sep 01 12:39:51 CST 2012
    15         
    16         /*
    17          * 以下代码用于试验java.sql.Date和java.sql.Time是否具有完整组件。 
    18          */
    19         System.out.println();
    20         try {
    21             System.out.println(sqlDate.getHours());
    22         } catch (Exception e) {
    23             System.out.println(e.getMessage()); // 输出 null
    24         }
    25         try {
    26             System.out.println(sqlTime.getDate());
    27         } catch (Exception e) {
    28             System.out.println(e.getMessage()); // 输出 null
    29         }
    30     }
    复制代码

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

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

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

      java.util.Date:

    复制代码
     1 package java.util;
     2 
     3 import java.text.DateFormat;
     4 import java.io.IOException;
     5 import java.io.ObjectOutputStream;
     6 import java.io.ObjectInputStream;
     7 import java.lang.ref.SoftReference;
     8 import sun.util.calendar.BaseCalendar;
     9 import sun.util.calendar.CalendarDate;
    10 import sun.util.calendar.CalendarSystem;
    11 import sun.util.calendar.CalendarUtils;
    12 import sun.util.calendar.Era;
    13 import sun.util.calendar.Gregorian;
    14 import sun.util.calendar.ZoneInfo;
    复制代码

      java.util.Calendar:

    复制代码
     1 package java.util;
     2 
     3 import java.io.IOException;
     4 import java.io.ObjectInputStream;
     5 import java.io.ObjectOutputStream;
     6 import java.io.OptionalDataException;
     7 import java.io.Serializable;
     8 import java.security.AccessControlContext;
     9 import java.security.AccessController;
    10 import java.security.PermissionCollection;
    11 import java.security.PrivilegedActionException;
    12 import java.security.PrivilegedExceptionAction;
    13 import java.security.ProtectionDomain;
    14 import java.text.DateFormat;
    15 import java.text.DateFormatSymbols;
    16 import java.util.concurrent.ConcurrentHashMap;
    17 import java.util.concurrent.ConcurrentMap;
    18 import sun.util.BuddhistCalendar;
    19 import sun.util.calendar.ZoneInfo;
    20 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来实现时间日期的格式化。

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

    复制代码
     1 public static void main(String[] args) {
     2         /*
     3          * 以下代码用于向大家展示各个时间日期类对象的包含组件。
     4          */
     5         java.sql.Date sqlDate = new java.sql.Date(System.currentTimeMillis());
     6         System.out.println(sqlDate.toString()); // 输出结果:2012-09-01
     7         java.sql.Time sqlTime = new java.sql.Time(System.currentTimeMillis());
     8         System.out.println(sqlTime.toString()); // 输出结果:12:35:11
     9         java.sql.Timestamp sqlTimestamp = new java.sql.Timestamp(System.currentTimeMillis());
    10         System.out.println(sqlTimestamp.toString()); // 输出结果:2012-09-01 12:36:33.544
    11         java.util.Date utilDate = new java.util.Date(System.currentTimeMillis());
    12         System.out.println(utilDate.toString()); // 输出结果:Sat Sep 01 12:37:34 CST 2012
    13         java.util.Calendar cl = java.util.Calendar.getInstance();
    14         System.out.println(cl.getTime().toString()); // 输出结果:Sat Sep 01 12:39:51 CST 2012
    15         
    16         /*
    17          * 以下代码用于试验java.sql.Date和java.sql.Time是否具有完整组件。 
    18          */
    19         System.out.println();
    20         try {
    21             System.out.println(sqlDate.getHours());
    22         } catch (Exception e) {
    23             System.out.println(e.getMessage()); // 输出 null
    24         }
    25         try {
    26             System.out.println(sqlTime.getDate());
    27         } catch (Exception e) {
    28             System.out.println(e.getMessage()); // 输出 null
    29         }
    30         
    31         /*
    32          * 下面的代码给大家展示时间日期的格式化。
    33          */
    34         System.out.println();
    35         java.text.DateFormat dateFormat = java.text.SimpleDateFormat.getInstance();
    36         // java.util.Date原本的格式
    37         System.out.println(utilDate.toString()); // 输出:Sat Sep 01 13:16:13 CST 2012
    38         // java.util.Date格式化后的格式
    39         System.out.println(dateFormat.format(sqlDate)); // 输出:12-9-1 下午1:16
    40         System.out.println();
    41         // 很多时候以上的结果并不是我们希望的,我们希望更加自由、更见简单的操作方式
    42         // 此时,java.text.SimpleDateFormat就成了我们的不二选择
    43         // SimpleDateFormat提供了无参和自定义格式参数的构造方法使我们能够轻松地实现自定义格式化
    44         java.text.SimpleDateFormat simpleDateFormat = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss a");
    45         System.out.println(simpleDateFormat.format(sqlDate)); // 输出:2012-09-01 13:20:41 下午
    46     }
    复制代码

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

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

      

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

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

  • 相关阅读:
    008Spring & JPA & Hibernate & MySQL
    007Spring Security
    006Spring面向切面
    005运行时值注入
    004bean作用域
    003自动装配歧义性解决
    002Conditional条件化创建bean
    001profile条件化创建bean
    007API网关服务Zuul
    Sqlserver2008R2 如何使用bak备份文件还原数据库以及对应的失败解决方案
  • 原文地址:https://www.cnblogs.com/doudouxiaoye/p/5669242.html
Copyright © 2011-2022 走看看