博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java中的时间日期处理
阅读量:7081 次
发布时间:2019-06-28

本文共 13843 字,大约阅读时间需要 46 分钟。

程序就是输入——>处理——>输出。对数据的处理是程序员需要着重注意的地方,快速、高效的对数据进行处理时我们的追求。其中,时间日期的处理又尤为重要和平凡,此次,我将把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全部源码: 。

二、类之间的关系。

  我们通过图解和部分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.54411         java.util.Date utilDate = new java.util.Date(System.currentTimeMillis());12         System.out.println(utilDate.toString()); // 输出结果:Sat Sep 01 12:37:34 CST 201213         java.util.Calendar cl = java.util.Calendar.getInstance();14         System.out.println(cl.getTime().toString()); // 输出结果:Sat Sep 01 12:39:51 CST 201215     }

  可以看到: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 Date12     * values do not have a time component.13     *14     * @deprecated15     * @exception java.lang.IllegalArgumentException if this method is invoked16     * @see #setHours17     */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 Date24     * values do not have a time component.25     *26     * @deprecated27     * @exception java.lang.IllegalArgumentException if this method is invoked28     * @see #setMinutes29     */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 Date36     * values do not have a time component.37     *38     * @deprecated39     * @exception java.lang.IllegalArgumentException if this method is invoked40     * @see #setSeconds41     */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 Date48     * values do not have a time component.49     *50     * @deprecated51     * @exception java.lang.IllegalArgumentException if this method is invoked52     * @see #getHours53     */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 Date60     * values do not have a time component.61     *62     * @deprecated63     * @exception java.lang.IllegalArgumentException if this method is invoked64     * @see #getMinutes65     */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 Date72     * values do not have a time component.73     *74     * @deprecated75     * @exception java.lang.IllegalArgumentException if this method is invoked76     * @see #getSeconds77     */78     public void setSeconds(int i) {79         throw new java.lang.IllegalArgumentException();80     }81 82    /**83     * Private serial version unique ID to ensure serialization84     * 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 TIME  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 TIME 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 TIME 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 TIME 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 TIME 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 TIME 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 TIME 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 serialization102     * 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.54411         java.util.Date utilDate = new java.util.Date(System.currentTimeMillis());12         System.out.println(utilDate.toString()); // 输出结果:Sat Sep 01 12:37:34 CST 201213         java.util.Calendar cl = java.util.Calendar.getInstance();14         System.out.println(cl.getTime().toString()); // 输出结果:Sat Sep 01 12:39:51 CST 201215         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()); // 输出 null24         }25         try {26             System.out.println(sqlTime.getDate());27         } catch (Exception e) {28             System.out.println(e.getMessage()); // 输出 null29         }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.54411         java.util.Date utilDate = new java.util.Date(System.currentTimeMillis());12         System.out.println(utilDate.toString()); // 输出结果:Sat Sep 01 12:37:34 CST 201213         java.util.Calendar cl = java.util.Calendar.getInstance();14         System.out.println(cl.getTime().toString()); // 输出结果:Sat Sep 01 12:39:51 CST 201215         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()); // 输出 null24         }25         try {26             System.out.println(sqlTime.getDate());27         } catch (Exception e) {28             System.out.println(e.getMessage()); // 输出 null29         }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 201238         // java.util.Date格式化后的格式39         System.out.println(dateFormat.format(sqlDate)); // 输出:12-9-1 下午1:1640         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进行时间日期的操作处理吧!

转载于:https://www.cnblogs.com/doudouxiaoye/p/5669242.html

你可能感兴趣的文章
Node.js环境性能监控
查看>>
CSS在没有设置高度的情况下如何让同级元素高度相等?
查看>>
Elastic Stack学习--elasticsearch部署常见问题
查看>>
Oracle 手工清理临时段
查看>>
通过git远程管理自己本地的工程
查看>>
scala中的下划线_
查看>>
QTreeWidget 获取被双击的子项的层次路径
查看>>
如何调整工作激情
查看>>
数据仓库专题(10)-文本事实和杂项维度
查看>>
VC6下实现remove_reference的方法。
查看>>
数据备份和还原
查看>>
Angular企业级开发(3)-Angular MVC实现
查看>>
SMS系列之一:部署SMS2003 + SP3
查看>>
查看mysql进程--show processlist
查看>>
ProtecTIER网关演绎重复数据删除的硬道理
查看>>
Android 播放Gif 动画
查看>>
(原创)创建windows域---深入理解域概念
查看>>
虚幻4,BP写了一个简单的三线跑酷工程
查看>>
“10亿元身价”CEO的6个密码
查看>>
C++/CLI思辨录之内部指针的两面性
查看>>