【问题标题】:In Python, is epoch time returned by time() always measured from Jan 1, 1970?在 Python 中,time() 返回的纪元时间是否总是从 1970 年 1 月 1 日开始测量?
【发布时间】:2012-12-20 14:32:01
【问题描述】:

Python 中的纪元开始时间是否与平台无关(即始终为 1970 年 1 月 1 日)?

还是依赖于平台?

我想在运行 Python 的各种机器上序列化日期时间(以秒精度),并能够在不同的平台上读回它们,可能还使用不同的编程语言(而不是 Python)。序列化纪元时间是个好主意吗?

【问题讨论】:

标签: python time epoch


【解决方案1】:

在 Python pandas.to_datetime() 中,虽然默认是 unix 纪元起源,但您可以通过提供自定义参考时间戳来更改它。

例如,

pd.to_datetime(18081) #default unix epoch
Out: Timestamp('1970-01-01 00:00:00.000018081') #default is in nanosecond

pd.to_datetime(18081, unit='D')
Out: Timestamp('2019-07-04 00:00:00') #change unit of measure

您可以将其更改为任何参考日期。确保单位合理。在下面的示例中,我们将原点设置为 1960 年 1 月 1 日。请注意,这是默认的 SAS 日期开始日期。

pd.to_datetime(18081, unit='D',  origin='1960-1-1') #change to your reference start date
Out: Timestamp('2009-07-03 00:00:00')

【讨论】:

    【解决方案2】:

    Micropython's 纪元是 1/1/2000,请参阅 time()utime

    【讨论】:

      【解决方案3】:

      The documentation 说:

      要了解时代是什么,请查看gmtime(0)

      我会将此解释为不保证特定的时期。

      另见this Python-Dev thread。这似乎证实了这样一个概念,即在实践中,时代总是被假定为 1970/01/01,但语言并未明确保证这一点。

      这样做的结果是,至少对于 Python,您可能可以使用纪元时间,除非您正在处理奇怪和晦涩的平台。对于使用非 Python 工具阅读,您可能还可以,但要特别确定您需要阅读这些工具提供的文档。

      【讨论】:

      • 那么like this?
      • @kojiro:你问gmtime是什么意思?它指的是Python time 模块中的gmtime 函数。
      • 我在问这比这低级意味着什么。 time.gmtime(0) 没有提供信息——你最终只会问同样的问题。构建 Python 的库,无论是 CPython、Jython、IronPython——这就是 gmtime() 的有趣定义所在。
      【解决方案4】:

      纪元时间(unix时间)是一个标准术语:

      http://en.wikipedia.org/wiki/Unix_time

      Unix 时间,或 POSIX 时间,是一种描述实例的系统 时间,定义为自以来经过的秒数 午夜协调世界时 (UTC),1970 年 1 月 1 日,[注 1] 不是 计算闰秒。[注 2] 它广泛用于类 Unix 和许多 其他操作系统和文件格式。它既不是线性的 时间的表示也不是 UTC 的真实表示。[注 3] Unix 在某些 Unix 系统上,可以通过在 命令行

      这意味着如果您通过 Python 使用纪元时间,它将跨平台保持一致。保持一致性的最佳选择是在所有情况下都使用 UTC。

      【讨论】:

      • 如果 Python 将在非 Unix 系统上运行会怎样?
      • @kaalus:通过python作为接口仍然会保持一致。
      • 还是同一个unix时间。仅仅因为名称中有“unix”并不意味着它只能在 Unix 系统上使用。保证您在所有支持的平台上都能获得一致的结果。
      • 我不相信这是正确的。文档说:“这个模块中定义的大多数函数都调用同名的平台 C 库函数。有时查阅平台文档可能会有所帮助,因为这些函数的语义因平台而异。”它可能适用于您关心的所有平台,但不能保证。
      • @BrenBarn:是的,可能是真的。如果您始终将其基于每个平台的 gmtime(0) 是一致的 :-) 我赞成您的回答。
      【解决方案5】:

      time() 总是会返回从纪元开始的时间,看看documentation

      请注意,Epoch 始终是自 1970 年以来的秒数,但由于不同机器上的时钟不一样 - 您可能会遇到一些问题。

      引用:

      纪元是时间开始的点。 1 月 1 日 年,在 0 小时,“自纪元以来的时间”为零。对于 Unix, 纪元是 1970 年。要了解纪元是什么,请查看 gmtime(0)。

      还有:

      time.time()¶

      以浮点数返回自纪元以来的时间(以秒为单位) 点数。请注意,即使时间总是以 浮点数,并非所有系统都提供更好的时间 精度大于 1 秒。虽然此函数通常返回 非递减值,它可以返回比前一个更低的值 如果系统时钟已在两次调用之间调回,则调用。

      (均来自 Python 文档)。

      【讨论】:

      • 确实不同的机器可能有不同的时钟时间。对此的一些解决方法包括在时间周围进行一些填充编程,以便每台机器都有一些让步,并使用像NTP 这样的系统来确保时钟相当接近。
      • 谢谢小次郎,很棒的信息:)
      猜你喜欢
      • 2020-06-18
      • 1970-01-01
      • 1970-01-01
      • 2010-11-08
      • 2021-03-31
      • 1970-01-01
      • 2018-03-21
      • 1970-01-01
      相关资源
      最近更新 更多