在Python中,time()返回的时代时间是否总是从1970年1月1日开始计算?

13

Python的起始纪元时间独立于平台吗(即始终为1970年1月1日)?

还是与平台有关?

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


可能是 Python 的 time.time() 是否与时区有关? 的重复问题。 - phihag
@phihag:你对另一个问题的回答也回答了这个问题,但问题本身并不是重复的。 - jfs
5个回答

11

文档中说:

要了解纪元是什么,请查看gmtime(0)

我理解这意味着没有特定的保证纪元。

另请参阅此Python-Dev线程。这似乎证实了实际上假定纪元始终为1970/01/01,但语言本身并未明确保证。

总之,在Python中,使用纪元时间应该是没问题的,除非你在处理奇怪和不常见的平台。对于使用非Python工具进行读取,你可能也没问题,但为了确保更加安全,你需要阅读这些工具提供的文档。


像这样的东西?(http://msdn.microsoft.com/en-us/library/0z9czt0w%28v=vs.80%29.aspx) - kojiro
@kojiro:你是在问什么是gmtime吗?它指的是Python time模块中的gmtime函数。 - BrenBarn
我想了解比这更低层次的含义。time.gmtime(0)并没有提供有用信息 - 你最终只会问同样的问题。Python所构建的库,无论是CPython、Jython还是IronPython - 那才是gmtime()有趣定义的来源。 - kojiro

3

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

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

Unix时间或POSIX时间是一种描述时间的系统,定义为自1970年1月1日协调世界时(UTC)午夜以来经过的秒数,不包括闰秒。它在类Unix和许多其他操作系统和文件格式中广泛使用。它既不是时间的线性表示,也不是UTC的真实表示。可以在某些Unix系统上通过在命令行上键入date +%s来检查Unix时间。

这意味着,如果您通过Python使用epoch时间,它将在所有平台上保持一致。对于一致性,您最好在所有情况下使用UTC。


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

1

1

time() 会始终返回自纪元以来的时间,请查看文档

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

引用:

时代是时间开始的地方。在那年的1月1日,0点,“自时代以来的时间”为零。对于Unix,时代是1970年。要找出时代是什么,请查看gmtime(0)。

和:

time.time()¶

以浮点数形式返回自纪元以来的秒数。请注意,即使时间始终作为浮点数返回,但并非所有系统都提供比1秒更好的精度的时间。虽然此函数通常返回非递减值,但如果在两次调用之间设置了系统时钟,则可以返回低于先前调用的值。

(均来自Python文档)。


1
不同的机器可能具有不同的时钟时间是事实。一些解决方法包括在时间周围编程一些填充,以便每台机器都有一些余地,并使用像NTP这样的系统来确保时钟相对接近。 - kojiro
谢谢kojiro,信息很棒 :) - Yam Mesicka

0
在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')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接