7

我在互联网上做了一些研究,但仍然感到困惑。UNIX 时间的通用时间是像 GMT/UTC 还是像本地时间一样因地而异?

我知道 UNIX 时间是从 1970 年 1 月 1 日 00:00:00 GMT 开始计算的。当我在 Java 中使用 getTime() 函数时(更具体地说是 Date d= new Date(); long currentTime d.getTime()),我得到了以毫秒为单位的 UNIX 时间。现在如果 A 人和 B 人在两个不同的时区使用相同的功能,他们会得到相同的结果吗?

4

2 回答 2

10

现在如果 A 人和 B 人在两个不同的时区使用相同的功能,他们会得到相同的结果吗?

是的,他们会的——当然,假设他们的时钟都是“正确的”。

该类java.util.Date基本上是“自 Unix 纪元以来的时间,以毫秒为单位”的包装。鉴于 Unix 时代是一个瞬间(不仅仅是“1970 年 1 月 1 日的午夜”,无论你在哪里,经过的毫秒数都是一样的。(忽略相对论和任何关于闰秒的讨论......)

(旁注:在 Unix 时代,格林威治不是午夜。当时是凌晨 1 点,因为当时英国正在观察 BST。那是英国标准时间,而不是英国夏令时 - 英国从 UTC+1 1968 年 2 月 18 日至 1971 年 10 月 31 日。有关更多类似的琐事,请参阅Noda Time 用户指南琐事页面。)

于 2015-04-23T07:18:19.843 回答
4

Jon Skeet的回答是正确的。我会补充一些想法。

Unix 时间对不同的人意味着不同的东西。正如维基百科文章所描述的那样,基本思想通常是自纪元以来的秒数,纪元是 1970 年UTC时区的第一刻。顾名思义,这种时间跟踪方法被用于类 Unix 操作系统中。

地方性

是否因地区而异?不,根据定义,它代表 UTC 时区。所以 Unix 时间中的时刻意味着奥克兰巴黎蒙特利尔的同一时刻。UTin 的意思UTC是“世界时”。

Unix 时间在无处不在的意义上是通用的吗?不,当然不是。

粒度

首先,粒度。随着计算机时钟芯片变得更加精确,传统的计算机系统开始以毫秒微秒甚至纳秒为单位跟踪时间。不同的软件采用不同的时间跟踪粒度。java.util.Date/.Calendar 类和Joda-Time库都使用毫秒分辨率,而Java 8 中内置的较新java.time 包采用纳秒分辨率。某些数据库(例如Postgres )通常采用微秒级分辨率。

从整秒到纳秒的时间跟踪粒度图。

引用问题……</p>

我以毫秒为单位获取 UNIX 时间

在技​​术上是矛盾的,因为传统的 Unix 时间或 POSIX 时间是按整秒而不是毫秒来跟踪的。

时代

其次,时代。1970 年的第一刻远非各种计算机系统使用的唯一时期。已经使用了几十个 epoch,其中一些使用非常广泛。例如,Microsoft Excel 和 Lotus 1-2-3 电子表格、CocoaGPS卫星、Galileo卫星、DOS 和 FAT 文件系统以及 ntp(网络时间协议),每个都使用从 1899 年到 2001 年的不同时期。

避免 Count-From-Epoch

通常最好通过从纪元开始计算毫秒(或任何粒度)来避免专注于处理日期时间值。这样的值很难被人类阅读和理解,从而使调试变得困难并且错误不明显。加上上面讨论的关于粒度和/或时期的假设可能出现的错误。

而是使用一个体面的日期时间库。在 Java 中,这意味着:

您是否通过收集 7 位或 8 位组来跟踪文本?不,您使用类和库来完成处理字符集、字符编码等的繁重工作。对日期时间工作执行相同的操作。

于 2015-04-24T00:52:51.587 回答