文档章节

【Java】Java中的时间日期处理

ok绷了绷
 ok绷了绷
发布于 2016/10/13 19:53
字数 2696
阅读 19
收藏 0

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

© 著作权归作者所有

ok绷了绷
粉丝 4
博文 125
码字总数 57978
作品 0
海淀
私信 提问
赶紧重写 Java 的时间和日期 API 吧!

最近 Java.net 的投票问题是:“在 Java 8 中实现 JSR-310(新的 Java 日期和时间 API)有多么重要? ”在这篇帖子发布的时候,对该话题已经有超过 150 条回应。其中“觉得非常重要”(53%),“...

墙头草
2012/03/27
5K
26
Java 8时间和日期API 20例

伴随lambda表达式、streams以及一系列小优化,Java 8 推出了全新的日期时间API,在教程中我们将通过一些简单的实例来学习如何使用新API。Java处理日期、日历和时间的方式一直为社区所诟病,将...

黄梦巍
2015/06/19
0
0
Java 8新的时间日期库的20个使用示例

除了lambda表达式,stream以及几个小的改进之外,Java 8还引入了一套全新的时间日期API,在本篇教程中我们将通过几个简单的任务示例来学习如何使用Java 8的这套API。Java对日期,日历及时间的...

清尘V
2015/03/17
0
0
clojure 新手指南(10):与java交互

clojure是基于jvm的语言,就是说clojure会被编译成字节码被jvm执行。但是clojure能做的可不仅仅是被编译成字节码,它提供了一套API让用户与java交互。因此clojure可以直接调用java世界中那些...

凯奥斯
2013/07/07
0
1
java8中的时间处理0 - api介绍

Java 8 Date Time API是我们java开发一直寻找的时间处理工具。java从一开始设计的时间类就让人头疼,好在现在终于有了java8。 为什么我们需要这套API 只要是有这么几个理由: Java的日期和时...

davelet
2018/02/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

思维导图XMind 8 Pro 绿化方法(附序列号)

按部就班: Step 1 -全新下载最新版本的 Xmind 8(注必须是英文官方的版本,中文代{过}{滤}理网站的版本修改过,无法使用pj); Step 2 -安装完毕后,点击文末的下载按钮下载pj补丁文件包,将...

一只小青蛙
49分钟前
6
0
数据结构(ER数据库)设计规范

表命名规范 表命名的规则分为3个层级,层级之间通过_分割,例如b_r_identity、d_l_identity。规约为: [leavel]_[type]_[name] [leavel] 表示数据库表的层级和功能,分为: s:业务无关的系统...

随风溜达的向日葵
今天
5
0
阿里Sentinel控制台源码修改-对接Apollo规则持久化

https://github.com/alibaba/Sentinel/wiki/%E5%9C%A8%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83%E4%B8%AD%E4%BD%BF%E7%94%A8-Sentinel 动态规则扩展 https://github.com/alibaba/Sentinel/wiki......

jxlgzwh
昨天
4
0
在Linux系统中创建SSH服务器别名

如果你经常通过 SSH 访问许多不同的远程系统,这个技巧将为你节省一些时间。你可以通过 SSH 为频繁访问的系统创建 SSH 别名,这样你就不必记住所有不同的用户名、主机名、SSH 端口号和 IP 地...

老孟的Linux私房菜
昨天
10
0
高德API入门教程

项目需求 1、实现打开地图就能定位到中心显示标注点 2、点击标注显示保利可爱岛的详细信息 3、实现导航功能 <!doctype html><html><head> <meta charset="utf-8"> <meta http-......

我叫小糖主
昨天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部