ISO-8601 UTC 和 Unix 时间戳之间是否存在一对一的关系?

Is there a one to one and onto relation between ISO-8601 UTC and Unix Timestamp?

时间格式

一个时间点通常表示为Unix Time, or as a human-readable ISO 8601 date in UTC时间字符串。

例如:

Unix 时间

自纪元以来的秒数,或 Unix 时间戳,以秒或毫秒为单位:

1529325705

1529325705000

ISO 8601 日期

2018-06-18T15:41:45+00:00

我的问题

两者之间是否存在一对一的关系?换句话说,是否存在一个时间点在一种格式中具有单一表示,而在另一种格式中具有多个或零个表示?

In other words, is there a point in time with a single representation in one format, and more than one, or zero, representations in the other?

没有。 UTC 时间取决于您的地理位置,即。你的纬度和经度。但是,UNIX 时间戳是一种将时间跟踪为 运行 总秒数的方法。此计数从 1970 年 1 月 1 日 UTC 的 Unix 纪元开始。 来自 Unix TimeStamp

It should also be pointed out that this point in time technically does not change no matter where you are located on the globe.

是的,可以找到这样的日期。来自 Unix 时间的 wiki 文章:

Every day is treated as if it contains exactly 86400 seconds,[2] so leap seconds are not applied to seconds since the Epoch.

这意味着闰秒本身不能用 Unix 时间表示。

例如,最近的闰秒发生在 2016 年底,因此 2016-12-31T23:59:60+00:00 是一个有效的 ISO 8601 时间戳。然而,前一秒的 Unix 时间戳,在 23:59:59,表示为 1483228799,后一秒,00:00:00(2017 年 1 月 1 日)是 1483228800,所以没有 Unix 时间戳表示闰秒。

实际上,这对您来说可能不是问题;自 1972 年引入闰秒以来,只有 27 个闰秒。


可能值得一提的是,ISO 8601 的大多数软件实现也不考虑闰秒,但如果被要求解析 "2016-12-31T23:59:60+00:00",则会执行其他操作。 .NET 中的 System.DateTime class 抛出异常,同时也可以想象库会 return 2017-01-01 00:00:00.

没有。两者之间有很好的对应关系,但关系是一对多,严格来说,对于给定的 ISO 日期时间字符串,甚至可能不存在精确的 Unix 毫秒。一些问题是:

  1. ISO 8601 格式有一些自由度,因此即使我们要求时间为 UTC(偏移量为零),也可以用多种方式编写相同的 Unix 毫秒。
    • 秒和秒的小数部分是可选的,秒的小数位数可能不同。例如,毫秒值 1 529 381 160 000 可以写成
      • 2018-06-19T04:06:00.000000000Z
      • 2018-06-19T04:06:00.00Z
      • 2018-06-19T04:06:00Z
      • 2018-06-19T04:06Z
    • 0的偏移量通常写成Z,但也可以像你在问题中那样写成+00:00。我认为形式 +00+0000 也可以(带负号的形式不行)。
  2. 由于 ISO 8601 中的秒可能有超过三位小数,因此可能没有精确的 Unix 毫秒匹配。因此,您必须接受截断(或舍入)才能转换为 Unix 时间。当然,如果你转换为 Unix 秒而不是毫秒,错误会更大。
  3. 正如 Thomas Lycken 指出的,闰秒可以在 ISO 8601 中表示,但不能在 Unix 时间中表示。