0

python中是否有一个内置函数可以用来解析MS时间戳?例如,这个“\x3a\xcf\x84\x72\x66\x42\xcd\x01”对应于这个日期和时间:06/04/2012, 15:26:43.901625

4

1 回答 1

0

时间戳(正如@mandel 提到的)看起来像FILETIME- 一个 64 位值,表示自 1601 年 1 月 1 日(UTC)以来 100 纳秒间隔的数量

import struct
from datetime import datetime, timedelta

def FILETIME_bytes_to_datetime(timestamp_bytes):
    quadword, = struct.unpack('<Q', timestamp_bytes)
    us = quadword // 10 - 11644473600000000
    return datetime(1970, 1, 1) + timedelta(microseconds=us)

例子:

>>> FILETIME_bytes_to_datetime(b"\x3a\xcf\x84\x72\x66\x42\xcd\x01")
datetime.datetime(2012, 6, 4, 15, 26, 43, 901625)

'<Q'(小端无符号 64 位整数)可能不适用于所有平台(由于 FILETIME 结构字段的对齐,字节序)。

要在 Windows 上解析值,您可以使用ctypes.wintypes.FILETIME结构:

import ctypes
import os
from datetime import datetime, timedelta

if os.name == 'nt':
    import ctypes.wintypes

    FILETIME = ctypes.wintypes.FILETIME
else: # fallback
    DWORD = ctypes.c_uint32

    class FILETIME(ctypes.Structure):
        _fields_ = [('dwLowDateTime', DWORD),
                    ('dwHighDateTime', DWORD)]

def FILETIME_bytes_to_datetime(timestamp_bytes):
    t = FILETIME.from_buffer_copy(timestamp_bytes)
    quadword = (t.dwHighDateTime << 32) + t.dwLowDateTime
    us = quadword // 10 - 11644473600000000
    return datetime(1970, 1, 1) + timedelta(microseconds=us)

它使用本机字节顺序、对齐方式(如有必要,您可以覆盖它)。

于 2015-11-04T05:33:46.063 回答