java date类 时区_Java Date 与时区

标签:

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

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

时区

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

1 Date now = newDate();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

标签:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值