在Python中将64位Windows日期时间转换

3
我需要将一个Windows十六进制64位(大端)的日期时间转换成Python中可读的格式?
例如 '01cb17701e9c885a' 转换为 "Tue, 29 June 2010 09:47:42 UTC"。
非常感谢任何帮助。
2个回答

14

看起来是一个Win32 FILETIME 值,它:

包含一个表示自1601年1月1日(UTC)以来的100纳秒间隔数的64位值。

要转换:

from datetime import datetime,timedelta
dt = '01cb17701e9c885a'
us = int(dt,16) / 10
print(datetime(1601,1,1) + timedelta(microseconds=us))

输出:

2010-06-29 09:47:42.754210

如果你使用datetime(1601,1,1,tzinfo=timezone.utc)作为纪元,你将得到的是UTC时间而不是本地时间。 - FObersteiner

1

该值是“自1601年1月1日午夜12:00:00以来已经过去的100纳秒间隔数”,因此您需要寻找类似以下内容的东西:

import datetime

def getFiletime(dt):
    microseconds = int(dt, 16) / 10
    seconds, microseconds = divmod(microseconds, 1000000)
    days, seconds = divmod(seconds, 86400)

    return datetime.datetime(1601, 1, 1) + datetime.timedelta(days, seconds, microseconds)

那么

print format(getFiletime('01cb17701e9c885a'), '%a, %d %B %Y %H:%M:%S %Z')

结果是

Tue, 29 June 2010 09:47:42

看起来 Python 的日期时间格式化在 1900 年之前的年份上会出现问题;如果你没有处理这样的日期,那么应该不会有问题。


@Mark Ransom:谢谢你;我发布了一个临时答案,然后被年份在1900年之前的日期格式转移了注意力(对此我也没有找到好的标准解决方案)。 - Hugh Bothwell

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