Java 使用getRawOffset方法进行时区混淆
我的一个项目实现了下面的方法,我正在研究日期问题,并试图理解下面的方法,该方法将给定的日期转换为GMT,但与输出混淆 输入日期值:2010-11-29 04:00:00.0Java 使用getRawOffset方法进行时区混淆,java,date,datetime,Java,Date,Datetime,我的一个项目实现了下面的方法,我正在研究日期问题,并试图理解下面的方法,该方法将给定的日期转换为GMT,但与输出混淆 输入日期值:2010-11-29 04:00:00.0 输出日期值:太阳2010年11月28日太平洋标准时间20:00:00 我的机器正在太平洋时区(PST)运行,如果它返回GMT,我希望是“2010-11-29 11:00:00.0”,您能否澄清getRawOffset()方法的用途以及它返回该输出的原因 public static Date convertToGMT(Date
输出日期值:太阳2010年11月28日太平洋标准时间20:00:00 我的机器正在太平洋时区(PST)运行,如果它返回GMT,我希望是“2010-11-29 11:00:00.0”,您能否澄清getRawOffset()方法的用途以及它返回该输出的原因
public static Date convertToGMT(Date date) {
TimeZone jvmTimeZone = TimeZone.getDefault();
long newTime = date.getTime() + jvmTimeZone.getRawOffset();
if (jvmTimeZone.inDaylightTime(date)) {
newTime = newTime + jvmTimeZone.getDSTSavings();
}
return new Date(newTime);
}
PST是UTC-8,因此
getRawOffset()
返回负值:
2010-11-29 04:00:00.0 + (-8 hours) = 2010-11-28 20:00:00.0
然而,你所做的一切都是错误的
Date
表示一个瞬间,即时间线上与任何时区都不关联的点。因此,将日期从一个时区转换为另一个时区是没有意义的。使用Date
只能将其转换为特定时区的本地日期/时间,反之亦然
我还建议你也使用。Jode Time区分瞬间(
DateTime
)和该瞬间的本地表示(LocalDateTime
)更清楚。代码只是垃圾,因为java.util.Date
总是GMT。它从来不是本地时间戳,所以试图将它从一个虚构的本地时间戳转换为GMT在概念上是毫无意义的
最初的意图可能是误用日期
作为一种本地时间戳(与其规范相矛盾),它是本地时间毫秒的薄包装。记住以下关系:[UTC millis]+[offset millis]=[local millis]我只会在这个计算中使用long
原语,而不是j.u.Date
因此,您可以在代码中看到许多不一致之处。
newTime
变量似乎是一种本地毫秒,但随后被包装为j.u.Date,并返回一个方法的结果,该方法假装转换为GMT(不可能出现更多混乱)。建议避免使用时区库,这太可怕了。使用Joda Time代替我的建议不要试图理解此代码。你应该试着去了解你的意图或目标,然后从头开始编写新的代码。这更容易。