java date setyear_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源代码来说明。

8e67ef207861c40ddbbf79c179f75d79.png

(上图有几处错误,Calendar拼写错误。)

以上的图列出了部分常用的类。我们一般会使用的类java.util.Date、java.util.Calendar、java.sql.Timestamp、java.text.DateFormat进行时间日期操作,因为他们有完全的时间日期组件和全面的格式化功能。

值得注意的是:java.sql.Date没有时间组件!而java.sql.Time没有日期组件!再次提醒。什么意思呢?大家请看下面的代码:

1 public static voidmain(String[] args) {2 /*

3 * 以下代码用于向大家展示各个时间日期类对象的包含组件。4 */

5 java.sql.Date sqlDate = newjava.sql.Date(System.currentTimeMillis());6 System.out.println(sqlDate.toString()); //输出结果:2012-09-01

7 java.sql.Time sqlTime = newjava.sql.Time(System.currentTimeMillis());8 System.out.println(sqlTime.toString()); //输出结果:12:35:11

9 java.sql.Timestamp sqlTimestamp = newjava.sql.Timestamp(System.currentTimeMillis());10 System.out.println(sqlTimestamp.toString()); //输出结果:2012-09-01 12:36:33.544

11 java.util.Date utilDate = newjava.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 packagejava.sql;2

3

4 public class Date extendsjava.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 *@deprecated

15 *@exceptionjava.lang.IllegalArgumentException if this method is invoked16 *@see#setHours17 */

18 public intgetHours() {19 throw newjava.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 *@deprecated

27 *@exceptionjava.lang.IllegalArgumentException if this method is invoked28 *@see#setMinutes29 */

30 public intgetMinutes() {31 throw newjava.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 *@deprecated

39 *@exceptionjava.lang.IllegalArgumentException if this method is invoked40 *@see#setSeconds41 */

42 public intgetSeconds() {43 throw newjava.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 *@deprecated

51 *@exceptionjava.lang.IllegalArgumentException if this method is invoked52 *@see#getHours53 */

54 public void setHours(inti) {55 throw newjava.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 *@deprecated

63 *@exceptionjava.lang.IllegalArgumentException if this method is invoked64 *@see#getMinutes65 */

66 public void setMinutes(inti) {67 throw newjava.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 *@deprecated

75 *@exceptionjava.lang.IllegalArgumentException if this method is invoked76 *@see#getSeconds77 */

78 public void setSeconds(inti) {79 throw newjava.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 TIME5 * values do not have a year component.6 *7 *@deprecated

8 *@exceptionjava.lang.IllegalArgumentException if this9 * method is invoked10 *@see#setYear11 */

12 @Deprecated13 public intgetYear() {14 throw newjava.lang.IllegalArgumentException();15 }16

17 /**

18 * This method is deprecated and should not be used because SQL TIME19 * values do not have a month component.20 *21 *@deprecated

22 *@exceptionjava.lang.IllegalArgumentException if this23 * method is invoked24 *@see#setMonth25 */

26 @Deprecated27 public intgetMonth() {28 throw newjava.lang.IllegalArgumentException();29 }30

31 /**

32 * This method is deprecated and should not be used because SQL TIME33 * values do not have a day component.34 *35 *@deprecated

36 *@exceptionjava.lang.IllegalArgumentException if this37 * method is invoked38 */

39 @Deprecated40 public intgetDay() {41 throw newjava.lang.IllegalArgumentException();42 }43

44 /**

45 * This method is deprecated and should not be used because SQL TIME46 * values do not have a date component.47 *48 *@deprecated

49 *@exceptionjava.lang.IllegalArgumentException if this50 * method is invoked51 *@see#setDate52 */

53 @Deprecated54 public intgetDate() {55 throw newjava.lang.IllegalArgumentException();56 }57

58 /**

59 * This method is deprecated and should not be used because SQL TIME60 * values do not have a year component.61 *62 *@deprecated

63 *@exceptionjava.lang.IllegalArgumentException if this64 * method is invoked65 *@see#getYear66 */

67 @Deprecated68 public void setYear(inti) {69 throw newjava.lang.IllegalArgumentException();70 }71

72 /**

73 * This method is deprecated and should not be used because SQL TIME74 * values do not have a month component.75 *76 *@deprecated

77 *@exceptionjava.lang.IllegalArgumentException if this78 * method is invoked79 *@see#getMonth80 */

81 @Deprecated82 public void setMonth(inti) {83 throw newjava.lang.IllegalArgumentException();84 }85

86 /**

87 * This method is deprecated and should not be used because SQL TIME88 * values do not have a date component.89 *90 *@deprecated

91 *@exceptionjava.lang.IllegalArgumentException if this92 * method is invoked93 *@see#getDate94 */

95 @Deprecated96 public void setDate(inti) {97 throw newjava.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 voidmain(String[] args) {2 /*

3 * 以下代码用于向大家展示各个时间日期类对象的包含组件。4 */

5 java.sql.Date sqlDate = newjava.sql.Date(System.currentTimeMillis());6 System.out.println(sqlDate.toString()); //输出结果:2012-09-01

7 java.sql.Time sqlTime = newjava.sql.Time(System.currentTimeMillis());8 System.out.println(sqlTime.toString()); //输出结果:12:35:11

9 java.sql.Timestamp sqlTimestamp = newjava.sql.Timestamp(System.currentTimeMillis());10 System.out.println(sqlTimestamp.toString()); //输出结果:2012-09-01 12:36:33.544

11 java.util.Date utilDate = newjava.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 packagejava.util;2

3 importjava.text.DateFormat;4 importjava.io.IOException;5 importjava.io.ObjectOutputStream;6 importjava.io.ObjectInputStream;7 importjava.lang.ref.SoftReference;8 importsun.util.calendar.BaseCalendar;9 importsun.util.calendar.CalendarDate;10 importsun.util.calendar.CalendarSystem;11 importsun.util.calendar.CalendarUtils;12 importsun.util.calendar.Era;13 importsun.util.calendar.Gregorian;14 import sun.util.calendar.ZoneInfo;

java.util.Calendar:

1 packagejava.util;2

3 importjava.io.IOException;4 importjava.io.ObjectInputStream;5 importjava.io.ObjectOutputStream;6 importjava.io.OptionalDataException;7 importjava.io.Serializable;8 importjava.security.AccessControlContext;9 importjava.security.AccessController;10 importjava.security.PermissionCollection;11 importjava.security.PrivilegedActionException;12 importjava.security.PrivilegedExceptionAction;13 importjava.security.ProtectionDomain;14 importjava.text.DateFormat;15 importjava.text.DateFormatSymbols;16 importjava.util.concurrent.ConcurrentHashMap;17 importjava.util.concurrent.ConcurrentMap;18 importsun.util.BuddhistCalendar;19 importsun.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 voidmain(String[] args) {2 /*

3 * 以下代码用于向大家展示各个时间日期类对象的包含组件。4 */

5 java.sql.Date sqlDate = newjava.sql.Date(System.currentTimeMillis());6 System.out.println(sqlDate.toString()); //输出结果:2012-09-01

7 java.sql.Time sqlTime = newjava.sql.Time(System.currentTimeMillis());8 System.out.println(sqlTime.toString()); //输出结果:12:35:11

9 java.sql.Timestamp sqlTimestamp = newjava.sql.Timestamp(System.currentTimeMillis());10 System.out.println(sqlTimestamp.toString()); //输出结果:2012-09-01 12:36:33.544

11 java.util.Date utilDate = newjava.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 201238 //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的功能)。您可以参照以下表格进行选择:

13702a6c7398d3c6a133ac57e9e1e6b7.png

(上图有一出错误:m和mm中,前者表示当分钟数小于10会只占用一个输出位,即输出0-9而不会输出00-09)

好了,大家赶紧利用jdk进行时间日期的操作处理吧!

欢迎您移步我们的交流群,无聊的时候大家一起打发时间:a0f609b288c7de88131b6f6ba37c81b3.png

或者通过QQ与我联系:d4e784ff4b6a12048cd256a11d33658c.png

(最后编辑时间2013-04-18 10:40:56)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值