只回答标题问题,“System.currentTimeMillis()返回的是UTC时间吗?”...
是的。Java API文档实际上说它是UTC时间:
currentTimeMillis
...
Returns: the difference, measured in milliseconds, between the current time and
midnight, January 1, 1970 UTC.
^^^
虽然我有一些疑问,这可能是为什么这个问题没有被直接回答的原因。
currentTimeMillis()的值是从系统板上由电池供电的硬件时钟派生出来的。实际值可以设置为任何值,但唯一真正明智的做法是将其设置为相对于UTC的EPOCH,以便设备不受特定时区的限制(设备经常在不同时区之间旅行和传输数据)。
然而,硬件时钟可以被更改,在过去,将其设置为本地时间并不罕见。我相信今天人们仍然使用本地时间有其原因。
如果你恰好使用Linux,你可以检查一下你的机器的硬件时钟是使用本地时间还是UTC:
Local time: Sat 2023-06-17 11:34:51 EDT
Universal time: Sat 2023-06-17 15:34:51 UTC
RTC time: Sat 2023-06-17 15:34:51
Time zone: America/New_York (EDT, -0400)
System clock synchronized: yes
NTP service: active
RTC in local TZ: no
^^
我不知道是否存在这样的情况,即如果硬件时钟设置为本地时区,currentTimeMillis()会返回基于本地时间的值。我的感觉是操作系统会对这些事情进行抽象处理,Java只是向操作系统询问。因此,如果System.currentTimeMillis()没有返回UTC值,那是因为操作系统配置不正确。
所以在大多数情况下,是的,System.currentTimeMillis()应该在各个时区返回相同的值(除了常规的漂移、闰秒等)。