这里有新鲜出炉的 Java 并发编程示例,程序狗速度看过来!
java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 程序设计语言和 Java 平台(即 JavaEE(j2ee), JavaME(j2me), JavaSE(j2se))的总称。
这篇文章主要介绍了 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 没有日期组件!再次提醒。什么意思呢?大家请看下面的代码:
- public static void main(String[] args) {
- /*
- * 以下代码用于向大家展示各个时间日期类对象的包含组件。
- */
- java.sql.Date sqlDate = new java.sql.Date(System.currentTimeMillis());
- System.out.println(sqlDate.toString()); // 输出结果:2012-09-01
- java.sql.Time sqlTime = new java.sql.Time(System.currentTimeMillis());
- System.out.println(sqlTime.toString()); // 输出结果:12:35:11
- java.sql.Timestamp sqlTimestamp = new java.sql.Timestamp(System.currentTimeMillis());
- System.out.println(sqlTimestamp.toString()); // 输出结果:2012-09-01 12:36:33.544
- java.util.Date utilDate = new java.util.Date(System.currentTimeMillis());
- System.out.println(utilDate.toString()); // 输出结果:Sat Sep 01 12:37:34 CST 2012
- java.util.Calendar cl = java.util.Calendar.getInstance();
- System.out.println(cl.getTime().toString()); // 输出结果:Sat Sep 01 12:39:51 CST 2012
- }
可以看到:java.util.Date、java.util.Calendar、java.sql.Timestamp 具有的时间日期组件(而且他们具有无参构造方法),java.sql.Date 和 java.sql.Time 只有时间或日期组件。
为了证实以上言论,我将部分 jdk 源码贴出来供大家参考。
java.sql.Date 源代码:
- package java.sql;
- public class Date extends java.util.Date {
- // 省略部分代码……
- // Override all the time operations inherited from java.util.Date;
- /**
- * This method is deprecated and should not be used because SQL Date
- * values do not have a time component.
- *
- * @deprecated
- * @exception java.lang.IllegalArgumentException if this method is invoked
- * @see #setHours
- */
- public int getHours() {
- throw new java.lang.IllegalArgumentException();
- }
- /**
- * This method is deprecated and should not be used because SQL Date
- * values do not have a time component.
- *
- * @deprecated
- * @exception java.lang.IllegalArgumentException if this method is invoked
- * @see #setMinutes
- */
- public int getMinutes() {
- throw new java.lang.IllegalArgumentException();
- }
- /**
- * This method is deprecated and should not be used because SQL Date
- * values do not have a time component.
- *
- * @deprecated
- * @exception java.lang.IllegalArgumentException if this method is invoked
- * @see #setSeconds
- */
- public int getSeconds() {
- throw new java.lang.IllegalArgumentException();
- }
- /**
- * This method is deprecated and should not be used because SQL Date
- * values do not have a time component.
- *
- * @deprecated
- * @exception java.lang.IllegalArgumentException if this method is invoked
- * @see #getHours
- */
- public void setHours(int i) {
- throw new java.lang.IllegalArgumentException();
- }
- /**
- * This method is deprecated and should not be used because SQL Date
- * values do not have a time component.
- *
- * @deprecated
- * @exception java.lang.IllegalArgumentException if this method is invoked
- * @see #getMinutes
- */
- public void setMinutes(int i) {
- throw new java.lang.IllegalArgumentException();
- }
- /**
- * This method is deprecated and should not be used because SQL Date
- * values do not have a time component.
- *
- * @deprecated
- * @exception java.lang.IllegalArgumentException if this method is invoked
- * @see #getSeconds
- */
- public void setSeconds(int i) {
- throw new java.lang.IllegalArgumentException();
- }
- /**
- * Private serial version unique ID to ensure serialization
- * compatibility.
- */
- static final long serialVersionUID = 1511598038487230103L;
- }
java.sql.Time 源代码:
- // 省略部分源代码……
- /**
- * This method is deprecated and should not be used because SQL <code>TIME</code>
- * values do not have a year component.
- *
- * @deprecated
- * @exception java.lang.IllegalArgumentException if this
- * method is invoked
- * @see #setYear
- */
- @Deprecated public int getYear() {
- throw new java.lang.IllegalArgumentException();
- }
- /**
- * This method is deprecated and should not be used because SQL <code>TIME</code>
- * values do not have a month component.
- *
- * @deprecated
- * @exception java.lang.IllegalArgumentException if this
- * method is invoked
- * @see #setMonth
- */
- @Deprecated public int getMonth() {
- throw new java.lang.IllegalArgumentException();
- }
- /**
- * This method is deprecated and should not be used because SQL <code>TIME</code>
- * values do not have a day component.
- *
- * @deprecated
- * @exception java.lang.IllegalArgumentException if this
- * method is invoked
- */
- @Deprecated public int getDay() {
- throw new java.lang.IllegalArgumentException();
- }
- /**
- * This method is deprecated and should not be used because SQL <code>TIME</code>
- * values do not have a date component.
- *
- * @deprecated
- * @exception java.lang.IllegalArgumentException if this
- * method is invoked
- * @see #setDate
- */
- @Deprecated public int getDate() {
- throw new java.lang.IllegalArgumentException();
- }
- /**
- * This method is deprecated and should not be used because SQL <code>TIME</code>
- * values do not have a year component.
- *
- * @deprecated
- * @exception java.lang.IllegalArgumentException if this
- * method is invoked
- * @see #getYear
- */
- @Deprecated public void setYear(int i) {
- throw new java.lang.IllegalArgumentException();
- }
- /**
- * This method is deprecated and should not be used because SQL <code>TIME</code>
- * values do not have a month component.
- *
- * @deprecated
- * @exception java.lang.IllegalArgumentException if this
- * method is invoked
- * @see #getMonth
- */
- @Deprecated public void setMonth(int i) {
- throw new java.lang.IllegalArgumentException();
- }
- /**
- * This method is deprecated and should not be used because SQL <code>TIME</code>
- * values do not have a date component.
- *
- * @deprecated
- * @exception java.lang.IllegalArgumentException if this
- * method is invoked
- * @see #getDate
- */
- @Deprecated public void setDate(int i) {
- throw new java.lang.IllegalArgumentException();
- }
- /**
- * Private serial version unique ID to ensure serialization
- * compatibility.
- */
- static final long serialVersionUID = 8397324403548013681L;
- }
从上面的代码可以看出:java.sql.Date 和 java.sql.Time 确实是不具有完整组件的!
我们再次利用代码来说明:
- public static void main(String[] args) {
- /*
- * 以下代码用于向大家展示各个时间日期类对象的包含组件。
- */
- java.sql.Date sqlDate = new java.sql.Date(System.currentTimeMillis());
- System.out.println(sqlDate.toString()); // 输出结果:2012-09-01
- java.sql.Time sqlTime = new java.sql.Time(System.currentTimeMillis());
- System.out.println(sqlTime.toString()); // 输出结果:12:35:11
- java.sql.Timestamp sqlTimestamp = new java.sql.Timestamp(System.currentTimeMillis());
- System.out.println(sqlTimestamp.toString()); // 输出结果:2012-09-01 12:36:33.544
- java.util.Date utilDate = new java.util.Date(System.currentTimeMillis());
- System.out.println(utilDate.toString()); // 输出结果:Sat Sep 01 12:37:34 CST 2012
- java.util.Calendar cl = java.util.Calendar.getInstance();
- System.out.println(cl.getTime().toString()); // 输出结果:Sat Sep 01 12:39:51 CST 2012
- /*
- * 以下代码用于试验java.sql.Date和java.sql.Time是否具有完整组件。
- */
- System.out.println();
- try {
- System.out.println(sqlDate.getHours());
- } catch(Exception e) {
- System.out.println(e.getMessage()); // 输出 null
- }
- try {
- System.out.println(sqlTime.getDate());
- } catch(Exception e) {
- System.out.println(e.getMessage()); // 输出 null
- }
- }
实验成功,所有给大家一个忠告:在进行数据库时间日期操作时,使用 java.sql.Timestamp 类。
那么很简单,如果您需要在程序中进行完整的时间日期操作,推荐您使用 java.util.Date+java.text.DateFormat。
如果您需要进行复杂或深入的操作,您可以选择 java.util.Calendar。有人说 Calendar 是 Date 的复杂版本,我觉得说得有一些道理。我们可以通过他们的依赖对象(通过源码文件中引入的外部类)来证实这个说法:
java.util.Date:
- package java.util;
- import java.text.DateFormat;
- import java.io.IOException;
- import java.io.ObjectOutputStream;
- import java.io.ObjectInputStream;
- import java.lang.ref.SoftReference;
- import sun.util.calendar.BaseCalendar;
- import sun.util.calendar.CalendarDate;
- import sun.util.calendar.CalendarSystem;
- import sun.util.calendar.CalendarUtils;
- import sun.util.calendar.Era;
- import sun.util.calendar.Gregorian;
- import sun.util.calendar.ZoneInfo;
java.util.Calendar:
- package java.util;
- import java.io.IOException;
- import java.io.ObjectInputStream;
- import java.io.ObjectOutputStream;
- import java.io.OptionalDataException;
- import java.io.Serializable;
- import java.security.AccessControlContext;
- import java.security.AccessController;
- import java.security.PermissionCollection;
- import java.security.PrivilegedActionException;
- import java.security.PrivilegedExceptionAction;
- import java.security.ProtectionDomain;
- import java.text.DateFormat;
- import java.text.DateFormatSymbols;
- import java.util.concurrent.ConcurrentHashMap;
- import java.util.concurrent.ConcurrentMap;
- import sun.util.BuddhistCalendar;
- import sun.util.calendar.ZoneInfo;
- 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 来实现时间日期的格式化。
下面的代码会给大家展示如何格式化时间日期:
- public static void main(String[] args) {
- /*
- * 以下代码用于向大家展示各个时间日期类对象的包含组件。
- */
- java.sql.Date sqlDate = new java.sql.Date(System.currentTimeMillis());
- System.out.println(sqlDate.toString()); // 输出结果:2012-09-01
- java.sql.Time sqlTime = new java.sql.Time(System.currentTimeMillis());
- System.out.println(sqlTime.toString()); // 输出结果:12:35:11
- java.sql.Timestamp sqlTimestamp = new java.sql.Timestamp(System.currentTimeMillis());
- System.out.println(sqlTimestamp.toString()); // 输出结果:2012-09-01 12:36:33.544
- java.util.Date utilDate = new java.util.Date(System.currentTimeMillis());
- System.out.println(utilDate.toString()); // 输出结果:Sat Sep 01 12:37:34 CST 2012
- java.util.Calendar cl = java.util.Calendar.getInstance();
- System.out.println(cl.getTime().toString()); // 输出结果:Sat Sep 01 12:39:51 CST 2012
- /*
- * 以下代码用于试验java.sql.Date和java.sql.Time是否具有完整组件。
- */
- System.out.println();
- try {
- System.out.println(sqlDate.getHours());
- } catch(Exception e) {
- System.out.println(e.getMessage()); // 输出 null
- }
- try {
- System.out.println(sqlTime.getDate());
- } catch(Exception e) {
- System.out.println(e.getMessage()); // 输出 null
- }
- /*
- * 下面的代码给大家展示时间日期的格式化。
- */
- System.out.println();
- java.text.DateFormat dateFormat = java.text.SimpleDateFormat.getInstance();
- // java.util.Date原本的格式
- System.out.println(utilDate.toString()); // 输出:Sat Sep 01 13:16:13 CST 2012
- // java.util.Date格式化后的格式
- System.out.println(dateFormat.format(sqlDate)); // 输出:12-9-1 下午1:16
- System.out.println();
- // 很多时候以上的结果并不是我们希望的,我们希望更加自由、更见简单的操作方式
- // 此时,java.text.SimpleDateFormat就成了我们的不二选择
- // SimpleDateFormat提供了无参和自定义格式参数的构造方法使我们能够轻松地实现自定义格式化
- java.text.SimpleDateFormat simpleDateFormat = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss a");
- System.out.println(simpleDateFormat.format(sqlDate)); // 输出:2012-09-01 13:20:41 下午
- }
(我不是为了占篇幅才贴上来重复代码的哦 ^_^)
java.text.SimpleDateFormat 的 format 方法使用参数提供了强大的格式化功能(另外,值得一提的是:它的 parse 方法也提供了强大的字符串转化为 Date 的功能)。您可以参照以下表格进行选择:
(上图有一出错误:m 和 mm 中,前者表示当分钟数小于 10 会只占用一个输出位,即输出 0-9 而不会输出 00-09)
好了,大家赶紧利用 jdk 进行时间日期的操作处理吧!
来源: http://www.phperz.com/article/17/1218/358834.html