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

Java中的时间日期处理的更多相关文章

  1. Java 中的时间日期 API

    自从 14 年发布 Java 8 以后,我们古老 java.util.Date 终于不再是我们 Java 里操作日期时间的唯一的选择. 其实 Java 里的日期时间的相关 API 一直为世猿诟病,不仅 ...

  2. Java中关于时间日期格式保存到mysql的问题

    首先在设置数据库的时间日期字段的时候要先确定好采用何种类型,DATETIME. TIMESTAMP.DATE.TIME.YEAR. 其中datetime.time用的比较多,对应java中生成的poj ...

  3. Java中的时间日期Date和Calendar

    日期时间类 Date: Date类的构造方法: 可以发现Date类的toString方法被重写了. Date类的方法: SimpleDateFormat 它提供了解决Date输出问题的解决方案--格式 ...

  4. Java中的时间处理

    日期时间组件使用 java.util.Date:实现类,其对象具有时间.日期组件.java.util.Calendar:抽象类,其对象具有时间.日期组件.java.sql.Date:实现类,其对象具有 ...

  5. JAVA中的时间操作

    java中的时间操作不外乎这四种情况: 1.获取当前时间 2.获取某个时间的某种格式 3.设置时间 4.时间的运算 好,下面就针对这四种情况,一个一个搞定. 一.获取当前时间 有两种方式可以获得,第一 ...

  6. 深入理解Java常用类-----时间日期

    除了String这个类在日常的项目中比较常用之外,有关时间和日期的操作也是经常遇到的,本篇就讲详细介绍下Java API中对时间和日期的支持.其实在Java 8之前时间日期的API并不是很好用,以至于 ...

  7. 1 Java中的时间类型

    总结:sql中的时间转 util的时间直接赋值即可:反过来,必须先吧util下的时间转换成毫秒,再通过sql的构造器生成sql的时间格式. 1 Java中的时间类型 java.sql包下给出三个与数据 ...

  8. Java中Date()类 日期转字符串、字符串转日期的问题(已解决)

    Java中Date()类 日期转字符串.字符串转日期的问题 今天在写东西的时候突然发现一个问题,就是先new 一个Date()然后将生成的值转为字符串, 然后再将转换后的字符串再次用new Date( ...

  9. asp.net中的时间日期选择控件

    asp.net中的时间日期选择控件 Posted on 2008-07-17 17:37 飛雪飄寒 阅读(22922) 评论(6) 编辑 收藏     在系统中经常需要进行时间日期选择(比如查询时间范 ...

随机推荐

  1. 类的"魔法"方法

    1. __init__()方法 <1>使用方式 def 类名: #初始化函数,用来完成一些默认的设定 def __init__(): pass 总结1 当创建Car对象后,在没有调用__i ...

  2. Gson转换时,Double转式化

    package com.mall.core; import java.lang.reflect.Type; import java.text.DecimalFormat; import com.goo ...

  3. SMO算法(转)

    作者:[已重置]链接:https://www.zhihu.com/question/40546280/answer/88539689来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请 ...

  4. makefile 中的赋值

    1. 在makefile 中可以使用后面定义的变量,未定义的变量值为空 = 使用变量时执行赋值操作 := 立即执行赋值操作 ?= 如果没有赋值过,就赋予后面的值 += 将后面的值追加到原来的值后面 参 ...

  5. Cookie进行会话管理

    一.会话的概念 会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. 有状态会话:一个同学来过教室,下次再来教室,我们会知道这个同学曾 ...

  6. 配置MySQL 5.6的主从复制

    工具/原料   Windows 7 64位 MySQL 5.6 配置新数据库的主从复制   1 先在主数据库中创建新数据库rep_test. 然后编辑主数据库的my.ini文件 在[mysqld]节点 ...

  7. rsa 公钥 私钥

    如果用于加密解密,那就是用公钥加密私钥解密(仅你可读但别人不可读,任何人都可写)如果用于证书验证,那就是用私钥加密公钥解密(仅你可写但别人不可写,任何人都可读) 最后,RSA的公钥.私钥是互相对应的. ...

  8. python之多并发socket

    先看socket多并发的服务端的代码,这里是用多线程实现的多并发socketserver import socketserver # socketserver有四个基本的类,后两个不常用,这4个类处理 ...

  9. VR

  10. Python学习记录day7

    目录 Python学习记录day7 1. 面向过程 VS 面向对象 编程范式 2. 面向对象特性 3. 类的定义.构造函数和公有属性 4. 类的析构函数 5. 类的继承 6. 经典类vs新式类 7. ...