Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用getRawOffset方法进行时区混淆_Java_Date_Datetime - Fatal编程技术网

Java 使用getRawOffset方法进行时区混淆

Java 使用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

我的一个项目实现了下面的方法,我正在研究日期问题,并试图理解下面的方法,该方法将给定的日期转换为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 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代替我的建议不要试图理解此代码。你应该试着去了解你的意图或目标,然后从头开始编写新的代码。这更容易。