【发布时间】:2012-01-30 00:48:39
【问题描述】:
快速提问: 是否有 pythonic(无论是否在标准库中)方法将 unix 32 位纪元时间转换为 Windows 64 位纪元时间并再次转换回来?
【问题讨论】:
标签: python windows unix datetime epoch
快速提问: 是否有 pythonic(无论是否在标准库中)方法将 unix 32 位纪元时间转换为 Windows 64 位纪元时间并再次转换回来?
【问题讨论】:
标签: python windows unix datetime epoch
您可以将 POSIX 时间戳转换为 datetime
>>> tstamp = 1325178061 # right about now
>>> from datetime import datetime
>>> datetime.fromtimestamp(tstamp)
datetime.datetime(2011, 12, 29, 18, 1, 1)
fromtimestamp 命名构造函数接受所有平台上的 POSIX 时间戳 (!)。
转换为 Windows 时间戳只需减去 Windows 纪元(Wikipedia says 是 1601 年 1 月 1 日),然后将生成的 timedelta 转换为秒数:
>>> W_EPOCH = datetime(1601, 1, 1)
>>> (datetime.fromtimestamp(tstamp) - W_EPOCH).total_seconds()
12969655261.0
现在您已经有了一个 float,您可以将其转换为 int 并以您喜欢的任何方式存储为 64 位数量。
【讨论】:
从 Windows EPOCH 时间戳转换为 datetime 对象(但不是相反);这是我想出的解决方案:
from datetime import datetime, timezone
def convert_from(windows_timestamp: int) -> datetime:
unix_epoch = datetime(1970, 1, 1, tzinfo=timezone.utc)
windows_epoch = datetime(1601, 1, 1, tzinfo=timezone.utc)
epoch_delta = unix_epoch - windows_epoch
windows_timestamp_in_seconds = windows_timestamp / 10_000_000
unix_timestamp = windows_timestamp_in_seconds - epoch_delta.total_seconds()
return datetime.utcfromtimestamp(unix_timestamp)
这允许您按原样传递 Windows 时间戳,它会输出一个有效的 Python datetime 对象。
注意:这是 Python 3 特有的。
【讨论】: