【问题标题】:Get UTC in java without using system time在不使用系统时间的情况下在 java 中获取 UTC
【发布时间】:2015-10-10 17:31:59
【问题描述】:

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

    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,因为系统时钟将在 DST 期间重置,这就是我要解决的问题。

【问题讨论】:

    标签: java datetime dst


    【解决方案1】:

    如果您想获得独立于系统时间的 UTC 时间,那么您可能需要通过 API 从外部源检索它,也许这个 http://www.timeapi.org/ 或者这个https://developers.google.com/maps/documentation/timezone/intro

    【讨论】:

    • @Tony Vu。这些外部来源可靠吗?您或某人是否使用过它而没有任何问题。我有一个执行基于时间的计算的关键应用程序,我希望它在 DST 后退/前进期间能够正常工作。任何帮助表示赞赏!
    • 我之前尝试过 Google Time Zone API(出于其他目的,不检索 UTC 时间)。在可靠性方面,我真的无法评论。
    【解决方案2】:

    ...当我在 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 将其写入 HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation 处的 ActiveTimeBias 注册表值

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 是的,我同意。但我需要有一个不会根据系统时间或本地时间或 DST 改变的标准时间。我的应用程序应该依靠这个标准时间来计算。有可能吗?
      • @ASB。您可以从外部来源获取时间(请参阅 Tony Vu 的回答)。但是,您的应用程序将依赖于 Internet 连接。但除此之外,没有。 Joda 时间 API 用于表示日期和时间并使用它们执行计算,而不是用于获取独立于系统的时间。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-19
      • 1970-01-01
      • 1970-01-01
      • 2014-12-07
      • 2021-04-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多