在不使用系统时间的情况下在java中获取UTC

时间:2015-07-21 10:06:08

标签: java datetime dst

我想将时区从本地时区更改为在我的应用程序中使用UTC。取代当地时间,我需要获得UTC时间,这与Joda datetime完美配合。但问题是当我在Windows上更改系统时间时,比如说时钟减1小时,UTC时间返回值一小时。所以我认为UTC时间是根据系统时间计算的。例如:系统时间是3点PDT,UTC显示10点。当我将系统时间更改为4:00 PDT时,UTC为11:00。虽然系统时间已更改,但UTC仍应显示当前的UTC时间,而不是基于sys时间。看起来偏移量是根据系统时间计算得到的。

    DateTime mypdt = new DateTime();
    DateTime myutc = new DateTime(DateTimeZone.UTC);
    System.out.println("mypdt--> "+mypdt);
    System.out.println("myutc--> "+myutc);

输出

    mypdt--> 2015-07-21T03:00:14.778-07:00
    myutc--> 2015-07-21T10:00:14.828Z

我在Windows机器上将系统时间更改为4:00,现在输出为

    mypdt--> 2015-07-21T04:00:14.778-07:00
    myutc--> 2015-07-21T11:00:14.828Z

但实际的UTC仍然是10:00。如何在不使用系统时间的情况下获得UTC,因为系统时钟将在夏令时期间重置,这是我试图解决的问题。

3 个答案:

答案 0 :(得分:1)

如果你想让UTC时间与你的系统时间无关,那么你可能需要通过API从外部源检索它,也许这个 http://www.timeapi.org/或此https://developers.google.com/maps/documentation/timezone/intro

答案 1 :(得分:0)

  

虽然系统时间已更改但UTC仍应显示当前的UTC时间,而不是基于sys时间。

为什么要这样? PDT是相对于UTC具有特定偏移(-7)的时区。因此,如果您将本地时间从PDT的3:00更改为PDT的4:00,UTC自然会随之改变。

如果您的目标是更改当地时间而不更改当前时间,则必须修改时区(例如更改为PST)或使用LocalDateTime(不包含时区)。

答案 2 :(得分:0)

  

...当我在Windows上更改系统时间时,比如减去1小时的时间,UTC时间会在一小时后返回值。所以我认为UTC时间是根据系统时间计算的。

你似乎误解了一个关键点。系统时间仅以UTC跟踪。当您在任务栏上看到时钟或通过应用程序或编程框架获取当前本地时间时,系统时间转换从UTC到本地时区。

当您设置计算机的时间时,您使用本地时间进行设置,该时间在分配给内部系统时钟之前立即转换为UTC。

  

...因为系统时钟将在DST期间重置,这是我正在尝试解决的问题。

不,它不会。系统时间正常前进。您始终可以从系统获取UTC时间,而无需担心其因DST更改而被更改。

换句话说,对于下一个DST转换,时钟将向前打勾,如下所示:

UTC                    Pacific
2015-11-01T08:59:58Z   2015-11-01T01:59:58-07:00
2015-11-01T08:59:59Z   2015-11-01T01:59:59-07:00
2015-11-01T09:00:00Z   2015-11-01T01:00:00-08:00
2015-11-01T09:00:01Z   2015-11-01T01:00:01-08:00

请注意,UTC时间没有变化,只有当地时间变化。另请注意,本地偏移量已更改,Windows写入ActiveTimeBias的{​​{1}}注册表值

当然,系统时间仍可由用户,操作系统在校正时钟漂移时或通过NTP同步进行修改。但您不必担心DST修改。

您可能也想知道BIOS。 Windows使用本地时间写入BIOS,但在启动时它会读取该值并转换为UTC并跟踪UTC。它还管理在设置本地时间或DST启动时写回BIOS。这对大多数程序都是透明的。