在Python中将Unix纪元时间转换为Windows纪元时间

5 投票
2 回答
8316 浏览
提问于 2025-04-17 09:13

我有个简单的问题:有没有一种比较“python风格”的方法(无论是用标准库还是其他库)可以把Unix的32位时间戳转换成Windows的64位时间戳,反之亦然?

2 个回答

2

如果你想把Windows的时间戳转换成一个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的。

11

你可以把一个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的起始时间,这个起始时间是1601年1月1日,具体可以参考维基百科。然后把得到的 timedelta 转换成秒数:

>>> W_EPOCH = datetime(1601, 1, 1)
>>> (datetime.fromtimestamp(tstamp) - W_EPOCH).total_seconds()
12969655261.0

现在你得到了一个 float 类型的数字,你可以把它转换成 int 类型,然后以你喜欢的方式存储为64位的数值。

撰写回答