在不使用系统时间的情况下获取 java 中的 UTC
Get UTC in java without using system time
我想在我的应用程序中将时区从本地时区更改为使用 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 期间重置,这就是我要解决的问题。
Though system time has changed UTC should still show current UTC time and not based on sys time.
为什么要这样做? PDT 是相对于 UTC 具有特定偏移量 (-7) 的时区。因此,如果您将本地时间从 3:00 PDT 更改为 4:00 PDT,UTC 自然会随之更改。
如果您的目标是更改当地时间而不更改时刻,则您必须修改时区(例如更改为太平洋标准时间)或使用 LocalDateTime
(不包含时区)。
如果你想获得独立于系统时间的 UTC 时间,那么你可能需要通过 API 从外部源检索它,也许这个
http://www.timeapi.org/ or this https://developers.google.com/maps/documentation/timezone/intro
... when I change the system time on windows, say minus 1 hour on the clock, UTC time is returning value an hour back. So I think UTC time is calculated based on system time.
你似乎误解了一个关键点。系统时间仅以 UTC 格式跟踪。当您在任务栏上看到时钟或通过应用程序或编程框架获取当前本地时间时,系统时间是 converted 从 UTC 到本地时区。
当您设置计算机的时间时,您使用的是本地时间,在分配给内部系统时钟之前会立即转换为 UTC。
... because system clock will be reset during DST and that is the problem I'm trying to resolve.
不,不会。系统时间像往常一样向前滴答作响。您始终可以从系统中获取 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
注册表值 HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation
当然,系统时间仍然可以修改,可以由用户修改,由OS修改时钟漂移,或者通过NTP同步。但您不必担心 DST 修改。
您可能还想知道 BIOS。 Windows 确实使用本地时间写入 BIOS,但在启动时它会读取该值并转换为 UTC 并跟踪 UTC。它还管理在设置本地时间或夏令时开始时写回 BIOS。这对大多数程序都是透明的。
我想在我的应用程序中将时区从本地时区更改为使用 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 期间重置,这就是我要解决的问题。
Though system time has changed UTC should still show current UTC time and not based on sys time.
为什么要这样做? PDT 是相对于 UTC 具有特定偏移量 (-7) 的时区。因此,如果您将本地时间从 3:00 PDT 更改为 4:00 PDT,UTC 自然会随之更改。
如果您的目标是更改当地时间而不更改时刻,则您必须修改时区(例如更改为太平洋标准时间)或使用 LocalDateTime
(不包含时区)。
如果你想获得独立于系统时间的 UTC 时间,那么你可能需要通过 API 从外部源检索它,也许这个 http://www.timeapi.org/ or this https://developers.google.com/maps/documentation/timezone/intro
... when I change the system time on windows, say minus 1 hour on the clock, UTC time is returning value an hour back. So I think UTC time is calculated based on system time.
你似乎误解了一个关键点。系统时间仅以 UTC 格式跟踪。当您在任务栏上看到时钟或通过应用程序或编程框架获取当前本地时间时,系统时间是 converted 从 UTC 到本地时区。
当您设置计算机的时间时,您使用的是本地时间,在分配给内部系统时钟之前会立即转换为 UTC。
... because system clock will be reset during DST and that is the problem I'm trying to resolve.
不,不会。系统时间像往常一样向前滴答作响。您始终可以从系统中获取 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
注册表值 HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation
当然,系统时间仍然可以修改,可以由用户修改,由OS修改时钟漂移,或者通过NTP同步。但您不必担心 DST 修改。
您可能还想知道 BIOS。 Windows 确实使用本地时间写入 BIOS,但在启动时它会读取该值并转换为 UTC 并跟踪 UTC。它还管理在设置本地时间或夏令时开始时写回 BIOS。这对大多数程序都是透明的。