Python 纪元 - 日期时间转换错误?
Python epoch - datetime conversion bug?
所以我有以下代码:
import pytz
from datetime import datetime
tz = pytz.timezone('Asia/Singapore')
original_time = tz.localize(datetime.now())
original_epoch = original_time.timestamp()
converted_dt = tz.localize(datetime.utcfromtimestamp(original_epoch))
converted_epoch = converted_dt.timestamp()
print('{}\t\t{}'.format(original_time, original_epoch))
print('{}\t\t{}'.format(converted_dt, converted_epoch))
然后吐出来
# Original Time Original Epoch
2018-07-16 02:17:41.583510+08:00 1531678661.58351
2018-07-15 18:17:41.583510+08:00 1531649861.58351
# Converted Time Converted Epoch
这是 Python 错误还是我只是遗漏了什么?无论哪种方式,我如何才能将日期时间转换为纪元并自信地返回正确的时间?
tz.localize()
不对给定的 datetime
执行任何时区调整;它只是将其 tzinfo
设置为给定的时区。对于您使用的时间戳,这意味着 tz.localtime()
执行以下操作:
datetime.now() -> tz.localize(datetime.now())
2018-07-16 02:17:41.583510 2018-07-16 02:17:41.583510+08:00
datetime.utcfromtimestamp(original_epoch) -> tz.localize(datetime.utcfromtimestamp(original_epoch))
2018-07-15 18:17:41.583510 -> 2018-07-15 18:17:41.583510+08:00
请注意,时间不会改变;只有时区偏移量。因为 tz.localize()
的输入是两个不同的天真时间,所以你会得到两个不同的感知超时。
从 UNIX 时间戳和时区构造 datetime
的正确方法是使用带有两个参数的 datetime.fromtimestamp()
:
>>> print(datetime.fromtimestamp(1531678661.58351, pytz.timezone('Asia/Singapore')))
2018-07-16 02:17:41.583510+08:00
所以我有以下代码:
import pytz
from datetime import datetime
tz = pytz.timezone('Asia/Singapore')
original_time = tz.localize(datetime.now())
original_epoch = original_time.timestamp()
converted_dt = tz.localize(datetime.utcfromtimestamp(original_epoch))
converted_epoch = converted_dt.timestamp()
print('{}\t\t{}'.format(original_time, original_epoch))
print('{}\t\t{}'.format(converted_dt, converted_epoch))
然后吐出来
# Original Time Original Epoch
2018-07-16 02:17:41.583510+08:00 1531678661.58351
2018-07-15 18:17:41.583510+08:00 1531649861.58351
# Converted Time Converted Epoch
这是 Python 错误还是我只是遗漏了什么?无论哪种方式,我如何才能将日期时间转换为纪元并自信地返回正确的时间?
tz.localize()
不对给定的 datetime
执行任何时区调整;它只是将其 tzinfo
设置为给定的时区。对于您使用的时间戳,这意味着 tz.localtime()
执行以下操作:
datetime.now() -> tz.localize(datetime.now())
2018-07-16 02:17:41.583510 2018-07-16 02:17:41.583510+08:00
datetime.utcfromtimestamp(original_epoch) -> tz.localize(datetime.utcfromtimestamp(original_epoch))
2018-07-15 18:17:41.583510 -> 2018-07-15 18:17:41.583510+08:00
请注意,时间不会改变;只有时区偏移量。因为 tz.localize()
的输入是两个不同的天真时间,所以你会得到两个不同的感知超时。
从 UNIX 时间戳和时区构造 datetime
的正确方法是使用带有两个参数的 datetime.fromtimestamp()
:
>>> print(datetime.fromtimestamp(1531678661.58351, pytz.timezone('Asia/Singapore')))
2018-07-16 02:17:41.583510+08:00