码迷,mamicode.com
首页 > 编程语言 > 详细

Java Date 与时区

时间:2015-09-08 06:59:01      阅读:263      评论:0      收藏:0      [点我收藏+]

标签:

Java 中,一个 Date 类对象内部包含2个信息:

  • 绝对时间,即从1970-1-1 00:00:00.000 经过的毫秒数,表示为long类型
  • 时区

绝对时间与时区无关。假设同一时刻,地球东西半球各有一位程序狗执行了以下代码,TA们将各自看到2行输出,其中第一行是相同的数值,而第二行则(极有可能)显示出不同的时间读数:

1 Date now = new Date();
2 
3 System.out.println(now.getTime());
4 System.out.println(now);

构造Date对象时,使用构造函数 new Date(long) 获得的对象其内部绝对时间是没有歧义的,就是构造函数参数。但是如果使用其它需要给定年/月/日/...等日期/时间读数的构造函数所获得的对象,在不同的时区,其内部绝对时间将不一定相同。反过来,如果不同时区的Date对象,其内部绝对时间相同,但通过Date.getYear()/Date.getMonth()/...方法获取到的读书也将可能不同(上例就是这种情况)。对Date类,所有年/月/日/...读数,不管是getter方法返回值还是setter方法/构造函数参数,都是代表本地时间,最终其内部绝对时间取决于所在的时区。

通过Date.getTimezoneOffset() 方法可以获得时区。该方法返回本地时间与UTC/GMT之间的差值,单位为分钟。例如我国时区为+08:00,也即我们的本地时间比UTC提前8小时(=480分钟),例如,对于同一个时间描述“x年x月x日x时x分x秒x毫秒”,本地时间发生得UTC早480分钟,也即绝对时间要比UTC小480分钟,因此,Date.getTimezoneOffset()返回值为-480。

如果要构造一个给定UTC年/月/日/...时间读数的Date对象,可借助 Date.UTC()方法先获得其绝对时间,然后再通过new Date(long)构造函数获得Date对象。注意,这样获得的Date对象,其getYear()/getMonth()/...等方法返回的日期/时间数值,已经转换为本地时间,不(一定)同于先前给定的UTC时间。

如果要获取某一个Date对象 that 所代表的绝对时间的UTC年/月/日/...日期/时间读数,可如此构造一个新的Date对象:new Date(that.getTime() - 60000 * that.getTimezoneOffset()),然后调用其 getYear()/getMonth()/...等方法即可。

如果以MVC模式作为类比,Date对象的内部绝对时间是Model,其年/月/日/...读数是View;同一个Model,在不同的时区,展现出来的View不同。如果需要在本地时间与UTC之间进行转换,记住一个公式,对于同一View:

本地时间 - UTC = timezoneOffset

 

Java Date 与时区

标签:

原文地址:http://www.cnblogs.com/pffar/p/java_Date_timezone.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!