【发布时间】:2012-12-20 14:32:01
【问题描述】:
Python 中的纪元开始时间是否与平台无关(即始终为 1970 年 1 月 1 日)?
还是依赖于平台?
我想在运行 Python 的各种机器上序列化日期时间(以秒精度),并能够在不同的平台上读回它们,可能还使用不同的编程语言(而不是 Python)。序列化纪元时间是个好主意吗?
【问题讨论】:
-
@phihag:您对另一个问题的回答也回答了这个问题,但问题本身不是重复的。
Python 中的纪元开始时间是否与平台无关(即始终为 1970 年 1 月 1 日)?
还是依赖于平台?
我想在运行 Python 的各种机器上序列化日期时间(以秒精度),并能够在不同的平台上读回它们,可能还使用不同的编程语言(而不是 Python)。序列化纪元时间是个好主意吗?
【问题讨论】:
在 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')
【讨论】:
Micropython's 纪元是 1/1/2000,请参阅 time() 和 utime。
【讨论】:
要了解时代是什么,请查看
gmtime(0)。
我会将此解释为不保证特定的时期。
另见this Python-Dev thread。这似乎证实了这样一个概念,即在实践中,时代总是被假定为 1970/01/01,但语言并未明确保证这一点。
这样做的结果是,至少对于 Python,您可能可以使用纪元时间,除非您正在处理奇怪和晦涩的平台。对于使用非 Python 工具阅读,您可能还可以,但要特别确定您需要阅读这些工具提供的文档。
【讨论】:
gmtime是什么意思?它指的是Python time 模块中的gmtime 函数。
time.gmtime(0) 没有提供信息——你最终只会问同样的问题。构建 Python 的库,无论是 CPython、Jython、IronPython——这就是 gmtime() 的有趣定义所在。
纪元时间(unix时间)是一个标准术语:
http://en.wikipedia.org/wiki/Unix_time
Unix 时间,或 POSIX 时间,是一种描述实例的系统 时间,定义为自以来经过的秒数 午夜协调世界时 (UTC),1970 年 1 月 1 日,[注 1] 不是 计算闰秒。[注 2] 它广泛用于类 Unix 和许多 其他操作系统和文件格式。它既不是线性的 时间的表示也不是 UTC 的真实表示。[注 3] Unix 在某些 Unix 系统上,可以通过在 命令行
这意味着如果您通过 Python 使用纪元时间,它将跨平台保持一致。保持一致性的最佳选择是在所有情况下都使用 UTC。
【讨论】:
gmtime(0) 是一致的 :-) 我赞成您的回答。
time() 总是会返回从纪元开始的时间,看看documentation。
请注意,Epoch 始终是自 1970 年以来的秒数,但由于不同机器上的时钟不一样 - 您可能会遇到一些问题。
引用:
纪元是时间开始的点。 1 月 1 日 年,在 0 小时,“自纪元以来的时间”为零。对于 Unix, 纪元是 1970 年。要了解纪元是什么,请查看 gmtime(0)。
还有:
time.time()¶
以浮点数返回自纪元以来的时间(以秒为单位) 点数。请注意,即使时间总是以 浮点数,并非所有系统都提供更好的时间 精度大于 1 秒。虽然此函数通常返回 非递减值,它可以返回比前一个更低的值 如果系统时钟已在两次调用之间调回,则调用。
(均来自 Python 文档)。
【讨论】: