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

    cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://p ...

  2. TOMCAT下面发布项目的4种方式

    摘要 TOMCAT下面发布项目的4种方式,可用于在平时资料查询. 第一种方法: 将web项目文件件拷贝到webapps 目录中:或者直接通过Eclipse发布到Tomcat上. 第二种方法: 在tom ...

  3. Android中WebView使用全解

    开始 在Android系统中内嵌的WebKit,这是一个浏览器内核,它帮助着我们可以浏览网页.在实际开发中,如果你想让你的App能够访问网页,那就需要用到WebView这个控件. 如何使用? 其实使用 ...

  4. 第六章 图(d)深度优先搜索

  5. SVN的基本操作

    右键SVN Commit 提交成功了,我们把SVN的服务器端刷新一下 所有的操作如果只是删除本地的文件都不会影响服务器端的文件,除非右键SVN Commit删除文件或者是新增文件才会对服务器端的仓库里 ...

  6. [leetcode]295. Find Median from Data Stream数据流的中位数

    Median is the middle value in an ordered integer list. If the size of the list is even, there is no ...

  7. php使用数组语法访问对象

    有一个对象,不过希望能用数组的语法来读写数据,可以使用 实现SPL的ArrayAccess接口来解决. 使用场景:加载配置文件类.larvel框架加载配置文件就这利用数组来操作对象. 数组式访问Obj ...

  8. git 常用命令笔记

    #提交代码会加上用户名和邮箱 git config --global user.name 名字 git config --global user.email 邮箱 git config --globa ...

  9. windows,phalcon工具的安装使用

    一.使用工具之前,必须安装phalcon的扩展,也就是php_phalcon.dll动态链接库 phalcon官方地址:https://github.com/phalcon/cphalcon/rele ...

  10. [PHP]require include