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

时间:2018-06-18 12:48:42

标签: time unix-timestamp iso8601

时间格式

时间点通常表示为Unix Time,或表示为人类可读的ISO 8601 date in UTC时间字符串。

例如:

Unix时间

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

  

1529325705

     

1529325705000

ISO 8601日期

  

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

我的问题

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

3 个答案:

答案 0 :(得分:1)

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

  

每天被视为恰好包含86400秒,[2]所以闰秒不会应用于纪元以来的秒数。

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

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

在实践中,这对您来说可能不是问题;自1972年推出以来,只有27秒的闰秒。

值得一提的是,ISO 8601的大多数软件实现也没有考虑闰秒,但如果要求解析"2016-12-31T23:59:60+00:00",则会做其他事情。 .NET中的System.DateTime类会引发异常,同时也可以想象库将返回2017-01-01 00:00:00。

答案 1 :(得分:0)

  

换句话说,是否存在一种格式中的单一表示形式,另一种格式中的多于一种或零种表示形式的时间点?

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

  

还应该指出,这个时间点在技术上并没有改变否   无论你身在何处。

答案 2 :(得分:0)

没有。两者之间有很好的对应关系,但关系是1到多,严格来说,对于给定的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时间表示。