0

MS タイムスタンプを解析するために使用できる Python の組み込み関数はありますか? たとえば、この「\x3a\xcf\x84\x72\x66\x42\xcd\x01」は、この日付と時刻に対応します: 06/04/2012, 15:26:43.901625

4

1 に答える 1

0

タイムスタンプ(@mandelが言及したように)は次のようにFILETIMEなります-1601年1月1日(UTC)からの100ナノ秒間隔の数を表す64ビット値

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 構造体フィールドのアライメント、エンディアンのため)。

ctypes.wintypes.FILETIMEWindows で値を解析するには、構造体を使用できます。

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 に答える