Python 将时间戳转换为 unix

Python convert timestamp to unix

我知道以前有人问过这些问题,但我正在努力将时间戳字符串转换为 unix 时间并弄清楚日期时间对象是天真还是有意识的

例如,要将时间“2021-05-19 12:51:47”转换为unix:

>>> from datetime import datetime as dt
>>> dt_obj = dt.strptime("2021-05-19 12:51:47", "%Y-%m-%d %H:%M:%S")
>>> dt_obj
datetime.datetime(2021, 5, 19, 12, 51, 47)

dt_obj天真还是有意识,您如何确定这一点? dt_obj 上的方法,例如 timetztzinfotzname 似乎没有任何指示 - 这是否意味着 dt_obj 是幼稚的?

然后获取 unix:

>>> dt_obj.timestamp()
1621421507.0

然而,当我在 https://www.unixtimestamp.com 上检查 1621421507.0 时,它告诉我上面的格林威治标准时间是 2021 年 5 月 19 日星期三 10:51:47 GMT+0000,即比原来晚 2 小时时间戳?

由于Python的日期时间默认将原始日期时间视为本地时间,您需要设置时区(tzinfo属性):

from datetime import datetime, timezone

# assuming "2021-05-19 12:51:47" represents UTC:
dt_obj = datetime.fromisoformat("2021-05-19 12:51:47").replace(tzinfo=timezone.utc)

或者,正如@Wolf 所建议的,除了显式设置 tzinfo 属性之外,您还可以通过添加解析为 UTC 的 "+00:00" 来修改输入字符串;

dt_obj = datetime.fromisoformat("2021-05-19 12:51:47" + "+00:00")

无论如何,结果

dt_obj.timestamp()
# 1621428707.0

现在可以在 https://www.unixtimestamp.com/ 上按预期进行转换:

datetime.timestamp()

Naive datetime instances are assumed to represent local time and this method relies on the platform C mktime() function to perform the conversion.

所以使用它会自动应用你的机器当前时区,下面的方法给出了在不受时区影响的情况下从原始日期时间计算时间戳:

timestamp = (dt - datetime(1970, 1, 1)) / timedelta(seconds=1)

只要调用strptime时不指定时区,就会产生naivedatetime对象。您可以通过 %z 格式说明符和 +00:00 添加到文本日期时间表示来传递时区信息,以获得时区 aware datetime 对象:

from datetime import datetime

dt_str = "2021-05-19 12:51:47"
print(dt_str)
dt_obj = datetime.strptime(dt_str+"+00:00", "%Y-%m-%d %H:%M:%S%z")
print(dt_obj)
print(dt_obj.timestamp())

上面的脚本是这样的:

2021-05-19 12:51:47
2021-05-19 12:51:47+00:00
1621428707.0