在Python中,如何将自纪元以来的秒数转换为“datetime”对象?

345

可以使用自纪元以来的秒数来初始化time模块:

>>> import time
>>> t1=time.gmtime(1284286794)
>>> t1
time.struct_time(tm_year=2010, tm_mon=9, tm_mday=12, tm_hour=10, tm_min=19, 
                 tm_sec=54, tm_wday=6, tm_yday=255, tm_isdst=0)

有没有一种优雅的方法可以以同样的方式初始化一个 datetime.datetime 对象?


4
执行相反的操作请访问此处:将datetime对象转换为秒 - Trevor Boyd Smith
5个回答

540

datetime.datetime.fromtimestamp这个方法可以实现,如果你知道时区信息,你便可以得到与time.gmtime相同的结果。

>>> datetime.datetime.fromtimestamp(1284286794)
datetime.datetime(2010, 9, 12, 11, 19, 54)
或者
>>> datetime.datetime.utcfromtimestamp(1284286794)
datetime.datetime(2010, 9, 12, 10, 19, 54)

54
奇怪的是,datetime.utcfromtimestamp 创建了一个无时区的时间戳。为了创建一个有时区的日期时间,我需要导入 pytz 并使用 datetime.fromtimestamp(1423524051, pytz.utc) - Matt
23
作为上述内容的延伸,在Python版本大于等于3.2时,如果你只需要UTC时间戳,则无需导入 pytz 库 - 只需 from datetime import datetime, timezone 然后按如下方式调用:datetime.fromtimestamp(1423524051, timezone.utc)。在我仅需要来自 pytz 的UTC时区信息时,这种方法已经多次节省了额外的库。 - phouse512

61

自纪元以来的秒数转换为datetimestrftime

>>> ts_epoch = 1362301382
>>> ts = datetime.datetime.fromtimestamp(ts_epoch).strftime('%Y-%m-%d %H:%M:%S')
>>> ts
'2013-03-03 01:03:02'

应该是 datetime.fromtimestamp(1579366345).strftime('%Y-%m-%d %H:%M:%S')。 - vml19
1
@vml19,这取决于是否从datetime导入了datetimeimport datetime vs. from datetime import datetime)。 - Alex Peters

51

从文档中得知,从自纪元以来的秒数获取一个具有时区意识的日期时间对象的推荐方式是:

Python 3

from datetime import datetime, timezone
datetime.fromtimestamp(timestamp, timezone.utc)

Python 2,使用pytz

from datetime import datetime
import pytz
datetime.fromtimestamp(timestamp, pytz.utc)

1
在您的字幕中提供文档链接(“Python 3”,“Python 2”)会很有用 - 我还建议更改它们的顺序。 - Adam Matan
已更新。保持原有顺序,因为这与Python文档相匹配。 - Meistro
你不需要pytz就可以获取utc时区信息对象。你可以很容易地自己创建它 - jfs

10

是的,还需要23年才能解决这个问题。 - user3666197
6
您可以使用 utc_time = datetime(1970,1,1) + timedelta(seconds=timestamp) 来解决此问题。 - jfs
这是一个问题。在美国,有许多人出生于1970年之前或1969年12月31日之前!那些存储在Java中的DOB可能会在手术过程中出现问题。 - Manabu Tokunaga

6

对于那些希望遵循ISO 8601标准的人,因为其他解决方案没有T分隔符和时间偏移量(除了Meistro的答案):

from datetime import datetime, timezone
result = datetime.fromtimestamp(1463288494, timezone.utc).isoformat('T', 'microseconds')
print(result) # 2016-05-15T05:01:34.000000+00:00

请注意,我使用 fromtimestamp,因为如果我使用 utcfromtimestamp,无论如何都需要链接 .astimezone(...) 才能获得偏移量。
如果你不想完全到 microseconds,你可以使用 isoformat() 方法选择不同的单位。

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