2016-08-10 4 views
1

Мне нужно преобразовать filetime в datetime. Я использую этот код filetime.py, от here как упоминалось в этой теме Datetime to filetime (Python).python конвертировать filetime в datetime для дат до 1970

В коде

EPOCH_AS_FILETIME = 116444736000000000 # January 1, 1970 as MS file time 
HUNDREDS_OF_NANOSECONDS = 10000000 

def filetime_to_dt(ft): 
    """Converts a Microsoft filetime number to a Python datetime. The new datetime object is time zone-naive but is equivalent to tzinfo=utc. 

    >>> filetime_to_dt(116444736000000000) 
    datetime.datetime(1970, 1, 1, 0, 0) 
    """ 
    # Get seconds and remainder in terms of Unix epoch 
    (s, ns100) = divmod(ft - EPOCH_AS_FILETIME, HUNDREDS_OF_NANOSECONDS) 
    # Convert to datetime object 
    dt = datetime.utcfromtimestamp(s) 
    # Add remainder in as microseconds. Python 3.2 requires an integer 
    dt = dt.replace(microsecond=(ns100 // 10)) 
    return dt 

datetime.utcfromtimestamp не принимает отрицательное значение на окна системы, поэтому я не могу конвертировать FILETIME до 1 янв 1970. Но я могу преобразовать даты до 1970 года на Mac, используя один и тот же код (причина here). Есть ли способ обхода окон?

+0

Итак, все, что вы имеете в виду, означает, что вы хотите конвертировать некоторое время в нормальное время? – harshil9968

ответ

2

Добавляя timedelta на базисную дату, вы можете использовать любую формулу даты вы хотите. timedelta может быть положительным или отрицательным.

def filetime_to_dt(ft): 
    us = (ft - EPOCH_AS_FILETIME) // 10 
    return datetime(1970, 1, 1) + timedelta(microseconds = us) 
1

According to docs, вы должны использовать:

dt = datetime.fromtimestamp(s, datetime.timezone.utc) 

вместо:

dt = datetime.utcfromtimestamp(s) 
+0

Извините, я использую 'import datetime datetime.timezone.utc', чтобы дать ошибку. Объект 'AttributeError:' module 'не имеет атрибута' timezone ''. Почему это? – Echo

+0

@Echo: Может быть, вы не используете Python 3? – BlackJack

+0

Я использую Python 2 – Echo

Смежные вопросы