我的一个项目实现了下面的方法,我正在查看日期问题之一并试图理解下面的方法,它将给定日期转换为GMT,但与输出混淆。
输入日期值:2010-11-29 04:00:00.0
输出日期值:Sun Nov 28 20:00:00 PST 2010
我的机器在太平洋时区(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);
}
答案 0 :(得分:1)
PST是UTC-8,因此getRawOffset()
返回负值:
2010-11-29 04:00:00.0 + (-8 hours) = 2010-11-28 20:00:00.0
但是,你要做的全部事情都是错误的。
Date
表示即时,即时间轴上与任何时区无关的点。因此,将Date
从一个时区转换为另一个时区是没有意义的。 Date
唯一能做的就是将它转换为某个时区的本地日期/时间,反之亦然。
另外我建议您也使用Joda Time。 Jode Time区分了瞬间(DateTime
)和该瞬间的本地表示(LocalDateTime
)更清晰。
答案 1 :(得分:0)
代码只是垃圾,因为java.util.Date
总是GMT。它永远不是本地时间戳,因此尝试将其从假想的本地时间戳转换为GMT是概念上的无意义。
最初的意图可能是滥用Date
作为一种本地时间戳(与其规范相矛盾),这是当地时间毫秒的薄包装。请记住以下关系:[UTC-millis] + [offset-millis] = [local-millis]我只是使用long
原语进行此计算,而不是j.u.Date。
因此,您可以在代码中看到许多不一致的内容。 newTime
变量似乎是一种局部毫秒,但是被包装成j.u.Date并返回一个假装转换为GMT的方法的结果(更难以产生混乱)。