Java Date and Time系列

转载:http://blog.csdn.net/pnet2008/article/details/17021579


Java中的时间和日期类型有好几种,很容易让初学者感到迷惑,本系列的目的就是把这些日期和时间的处理类型

放在一起做个介绍,让大家能对这些日期和时间处理类有个全面的了解。


Java中包含了以下的日期和时间的处理类或方法

System.currentTimeMillis()

System类的一个静态方法,返回从1970年1月1日到现在的毫秒数。

java.util.Date

一个日期和时间的表示类,不过它里面的好多方法都是不推荐使用的。

java.sql.Date

一个被JDBC使用的日期类,里面好多方法也是不推荐使用的

java.sql.Time

一个被JDBC使用的时间类,里面好多方法也是不推荐使用的

java.sql.Timestamp

一个被JDBC使用的时间戳类

java.util.Calendar

一个基本的日历类,这个类提供了一些方法可以在一个日期上对年月日等做运算来得到另一个日期。

java.util.GregorianCalendar

java.util.Calendar类的一个具体子类,提供了世界上大多数国家/地区使用的标准日历系统。

java.util.TimeZone

一个时区表示类,在跨时区表示日历时比较有用。

java.text.SimpleDateFormat

一个日期转换类,提供日期类型和字符串之间的互相转换。


那么我们该使用哪个类呢?这取决于你的程序要完成的任务,在接下来的小节中我会对这些类做详细介绍。


一、

System.currentTimeMillis()

静态方法System.currentTimeMillis()返回1970-01-01 00:00:00.000到现在的毫秒数,返回值是一个long型

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. long timeNow = System.currentTimeMillis();  
返回值可以用来初始化java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp,例如:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. long timeNow = System.currentTimeMillis();  
  2.   
  3. java.util.Date uDate = new java.util.Date(timeNow);  
  4. System.out.println(uDate.toString());  
  5.   
  6. java.sql.Date sDate = new java.sql.Date(timeNow);  
  7. System.out.println(sDate.toString());  
  8.   
  9. Time time = new Time(timeNow);  
  10. System.out.println(time.toString());  
  11.   
  12. Timestamp timestamp = new Timestamp(timeNow);  
  13. System.out.println(timestamp.toString());  

System.nanoTime()

顺便说一下System.nanoTime(),这也是一个静态方法,获得一个以纳秒为单位的值。但是它和日期或时间的表示没有任何关系,不要将它和当前的日期或时间联系起来。在上面我们看到System.currentTimeMillis()返回的是1970-01-01 00:00:00.000到现在的毫秒数,但System.nanoTime()返回的不是1970-01-01 00:00:00.000到现在的纳秒数,这个计时开始时间是不确定的。

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. //如果System.nanoTime()和当前时间有关系,那millis应该和当前毫秒数近似相等  
  2. long millis = System.nanoTime()/1000;  
  3. java.util.Date date = new java.util.Date(millis);  
  4.   
  5. /* 
  6.  * 但这个date的值明显和当前日期差距甚大,而且每次启动jvm运行都不一样 
  7.  * 说明System.nanoTime()的开始计时时间并不是一个固定值 
  8.  */  
  9. System.out.println(date.toString());  
System.nanoTime()虽然和当前时间没关系,但是API文档中推荐用它可以来衡量程序的运行时间

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. long startTime = System.nanoTime();  
  2. // ... the code ...  
  3. long estimatedTime = System.nanoTime() - startTime;  

以上这段程序在大多数情况下可以得到我们期望的结果,但也有例外,例如在window xp系统中可能会出现负值。

至于为什么出现负值,网上有资料说和CPU和操作系统都有关系,由于本人理解也很局限,不妄下定论,有兴趣的同学可以研究一下。


二、

Java.util.Date的创建

java.util.Date这个类可能是我们最常用的一个用来表示日期的类了。我们可以像下面这样初始化一个实例来表示当前日期和时间:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. java.util.Date date = new java.util.Date();  
Date类中有一个getTime()方法可以用来获取日期实例的毫秒表示

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. java.util.Date date = new java.util.Date();  
  2. long time = date.getTime();  
这个time的值和在创建date实例的时刻调用System.currentTimeMillis()获取到的值是一样的。
所以,你也可以像下面这样创建一个日期实例:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. long now = System.currentTimeMillis();  
  2. java.util.Date date = new java.util.Date(now);  

java.util.Date之间的比较

由于java.util.Date实现了java.lang.Comparable接口,所以我们可以像下面那样使用compareTo()方法来比较两个实例的值:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. java.util.Date date1 = new java.util.Date();  
  2. java.util.Date date2 = new java.util.Date();  
  3.   
  4. int comparison = date1.compareTo(date2);  
如果date1小于date2返回-1
如果date1和date2相等返回0
如果date1大于date2返回1

除了使用compareTo()方法,还可以使用Date类另外提供的before()和after()方法来进行比较

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. java.util.Date date1 = new java.util.Date();  
  2. java.util.Date date2 = new java.util.Date();  
  3.   
  4. boolean isBefore = date1.before(date2);  
  5. boolean isAfter  = date1.after (date2);  
注意,不管是使用compareTo()还是使用before()和after()来进行比较,这个比较的精度都是只精确到毫秒。

写在结尾

java.util.Date关于年月日等get和set操作都已经是不推荐的方法了,如果需要对这些值进行操作,那我们该考虑使用java.util.Calendar类来代替java.util.Date类。


三、ava.util.Calendar是一个抽象类,它定义了日历相关的一系列操作,使用java.util.Calendar除了可以表示日期和时间,还可以用它来对时期或时间进行算术运算,比如获取当前日期10天之后的日期。

Java.util.Calendar由于是一个抽象类,所以我们不能对它进行实例化,如果想获得一个日历实例,可能要用到java.util.GregorianCalendar类。


实例化

java.util.GregorianCalendar是java.util.Calendar的一个实现类,当然除了java.util.GregorianCalendar还有其它实现类,这里不做讨论。
可以像下面这样获得一个日历实例:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. Calendar calendar1 = Calendar.getInstance();  
  2. Calendar calendar2 = new GregorianCalendar();  
calendar1和calendar2都是代表了一个以当前日期和时间为基础的日历对象。


获取日期和时间

Calendar类提供了一系列方法可以用来获取年、月、日、时、分、秒、毫秒、时区等,像下面这样:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. Calendar calendar = new GregorianCalendar();  
  2.   
  3. int year       = calendar.get(Calendar.YEAR);  
  4. int month      = calendar.get(Calendar.MONTH); // 月份从0开始  
  5. int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH);   
  6. int dayOfWeek  = calendar.get(Calendar.DAY_OF_WEEK);  
  7. int weekOfYear = calendar.get(Calendar.WEEK_OF_YEAR);  
  8. int weekOfMonth= calendar.get(Calendar.WEEK_OF_MONTH);  
  9.   
  10. int hour       = calendar.get(Calendar.HOUR);        // 12小时制  
  11. int hourOfDay  = calendar.get(Calendar.HOUR_OF_DAY); // 24小时制  
  12. int minute     = calendar.get(Calendar.MINUTE);  
  13. int second     = calendar.get(Calendar.SECOND);  
  14. int millisecond= calendar.get(Calendar.MILLISECOND);  
当然不止这些,还有其它的,可以参看JavaDoc文档。


设置日期和时间

calendar除了提供了get方法来获取日期或时间,也提供了许多set方法用来设置日历实例的日期或时间:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. Calendar calendar = new GregorianCalendar();  
  2.   
  3. calendar.set(Calendar.YEAR, 2013);  
  4. calendar.set(Calendar.MONTH, 11);  
  5. calendar.set(Calendar.DAY_OF_MONTH, 24);  

关于日历的算术运算

使用Calendar的add()方法可以对日历实例进行计算,比如:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. Calendar calendar = new GregorianCalendar();  
  2.   
  3. //将日期设置为2013年最后一天  
  4. calendar.set(Calendar.YEAR, 2013);  
  5. calendar.set(Calendar.MONTH, 11); // 11表示12月份  
  6. calendar.set(Calendar.DAY_OF_MONTH, 31); // 元旦前一天  
  7.   
  8. //增加一天  
  9. calendar.add(Calendar.DAY_OF_MONTH, 1);  
  10.   
  11. //日期变为2014年的第一天  
  12. int year       = calendar.get(Calendar.YEAR);  // 2014  
  13. int month      = calendar.get(Calendar.MONTH); // 一月份  
  14. int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH); // 一日  
如果做减法,可以给add()传递一个负值来达到目的:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. calendar.add(Calendar.DAY_OF_MONTH, -1);  


需要注意的地方

1、calendar类中使用0到11来表示1到12个自然月,0表示一月份,11表示12月份,比如calendar.get(Calendar.MONTH)的值是5,那么表示6月份。
2、calendar类中使用1到7来表示周日到周六,1表示周日,7表示周六,比如calendar.get(Calendar.DAY_OF_WEEK)的值是3,那么表示周二。


四、

Java.text.SimpleDateFormat类我们一般用来它实现字符串于java.util.Date之间的互转,比如将Date实例转换为指定的字符串表示形式,

或者将一个字符串的日期表示转为具体的Date实例。


创建SimpleDateFormat实例

可以像下面一样创建一个SimpleDateFormat实例:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. String pattern = "yyyy-MM-dd";  
  2. SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);  
其中pattern参数用来指定字符串和日期互转时的格式。


日期转换成字符串

使用format()方法可以将一个日期类型的值转换为字符串表示形式,比如:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. String pattern = "yyyy-MM-dd";  
  2. SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);  
  3.   
  4. String date = simpleDateFormat.format(new Date());  
  5. System.out.println(date); // 2013-12-04  
注意,format()方法的参数必须是java.util.Date类型的实例。


字符串转换为日期

使用parse()方法可以可以将一个日期形式的字符串转换为一个java.util.Date类型:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. String pattern = "yyyy-MM-dd";  
  2. SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);  
  3.   
  4. Date date = simpleDateFormat.parse("2013-12-04");  

根据具体的语言环境创建SimpleDateFormat实例

具体的语言环境可以通过Locale类表示,在这先不做介绍了。想通过具体语言环境来创建SimpleDateFormat实例可以像下面那样:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. String pattern = "EEEEE MMMMM yyyy HH:mm:ss.SSSZ";  
  2. SimpleDateFormat simpleDateFormat =  
  3.         new SimpleDateFormat(pattern, new Locale("zh""ZH")); //指定具体语言环境  
  4.   
  5. String date = simpleDateFormat.format(new Date());  
  6. System.out.println(date);  
输出如下:

[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. 星期三 十二月 2013 17:09:04.757+0800  
我们发现星期和月份的表示都是中文的,如果new Locale("zh", "ZH")换成new Locale("en", "EN"),那输出就会变为:Wednesday December 2013 17:09:04.757+0800

常用日期格式

[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. dd-MM-yy                            31-01-12  
  2. dd-MM-yyyy                          31-01-2013  
  3. MM-dd-yyyy                          01-31-2013  
  4. yyyy-MM-dd                          2013-01-31  
  5. yyyy-MM-dd HH:mm:ss                 2013-01-31 23:59:59  
  6. yyyy-MM-dd HH:mm:ss.SSS             2013-01-31 23:59:59.999  
  7. yyyy-MM-dd HH:mm:ss.SSSZ            2013-01-31 23:59:59.999+0100  
  8. EEEEE MMMMM yyyy HH:mm:ss.SSSZ      Saturday November 2013 10:45:42.720+0100  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值