2012-06-04 3 views
0

Есть ли встроенная функция в python, которую я могу использовать для разбора временных меток MS? Например, это "\ X3A \ XCF \ x84 \ x72 \ x66 \ x42 \ XCD \ x01" соответствуют этой дате & время: 06/04/2012, 15: 26: 43,901625MS Timestamp parsing Python

+2

Где находится метка времени? вы получаете структуру FILETIME? (http://msdn.microsoft.com/en-us/library/ms724284%28v=vs.85%29.aspx) – mandel

+0

Он исходит из сети, в частности службы BROWSER. – n00bz0r

ответ

0

Отметка времени (как @mandel mentioned) выглядит как FILETIME -- a 64-bit value representing the number of 100-nanosecond intervals since January 1, 1601 (UTC):

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 STRUC поля зрения, сущность).

Чтобы разобрать значение на 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) 

Он использует родной порядок байтов, выравнивание (вы можете заменить его в случае необходимости).