2013-09-15 3 views
19

Возможно ли, и если да, то как получить часовой пояс (например, UTC offset или datetime.timezone экземпляр с этим смещением), который используется datetime.datetime.fromtimestamp() для преобразования POSIX timestamp (секунды с эпохи) до объекта datetime?Получить часовой пояс, используемый datetime.datetime.fromtimestamp()

datetime.datetime.fromtimestamp() преобразует временную метку POSIX к наивным datetime объекта (т.е. без tzinfo), но делает это с помощью языковой системы, чтобы приспособить ее к локальной временной зоне UTC и смещение, которое было в силе в то время.

Например, используя дату 2008-12-27 полночь UTC (40 * 356 * 86400 секунд с начала эпохи):

>>> datetime.datetime.fromtimestamp(40 * 356 * 86400) 
datetime.datetime(2008, 12, 27, 1, 0) 

, что отметка времени преобразуется в datetime объекта на 1 час в утром (которое было в то время здесь, в часовом поясе CET/CEST). 100 дней спустя, это результат:

>>> datetime.datetime.fromtimestamp((40 * 356 + 100) * 86400) 
datetime.datetime(2009, 4, 6, 2, 0) 

Что такое 2 часа утра. Это потому, что к тому времени DST был активным.

Я ожидал, что datetime.datetime.fromtimestamp() установит tzinfo, который он использует в возвращаемом экземпляре datetime, но это не так.

ответ

14

datetime.fromtimestamp(ts) преобразует «секунды с эпохи» в наивный объект datetime, представляющий местное время. tzinfo всегда None в этом случае.

Локальный часовой пояс, возможно, имел другое смещение UTC в прошлом. В некоторых системах, которые обеспечивают доступ к базе данных хронологического времени, fromtimestamp() может принять это во внимание.

Чтобы получить UTC смещение используется fromtimestamp():

utc_offset = fromtimestamp(ts) - utcfromtimestamp(ts) 

Смотрите также Getting computer's utc offset in Python.

+0

Это на самом деле то, что мне понадобилось бы назад, когда я задал вопрос. Знание правил часового пояса не имеет значения, достаточно только смещения UTC для того, что я делаю. – Feuermurmel

2

Используя time.gmtime, вы можете извлечь часовой пояс, как описано в этом предыдущем ответе: Get TZ information of the system in Python?.

>>> from __future__ import print_function 
>>> from time import gmtime, strftime 
>>> print(strftime("%z", gmtime())) 
-0600 

Печать -06: 00 для моего CST ноутбук в обоих питон-2.7 и питон-3.3 Вы также можете использовать МестноеВремя(), чтобы получить местное время структуры.

>>> from __future__ import print_function 
>>> from time import localtime 
>>> lt = localtime() 
>>> print(lt.tm_zone) 
"CDT" 
>>> print(lt.tm_gmtoff/(60*60)) 
-5.0 
>>> print(lt.tm_gmtoff/(60*60) - (1 if lt.tm_isdst == 1 else 0)) # Adjusted for DST 
-6.0 

Надеется, что это помогает

+0

Вам не понравился конкретный ответ (вы можете сделать это, щелкнув _share_ ниже ответа и скопировав URL-адрес), что вы имеете в виду? – Feuermurmel

+0

Вы, вероятно, имели в виду 'time.gmtime'. В Python 3.3 он печатает 'time.struct_time (tm_year = 2008, tm_mon = 12, tm_mday = 27, tm_hour = 0, tm_min = 0, tm_sec = 0, tm_wday = 5, tm_yday = 362, tm_isdst = 0)'. Я не вижу информации о часовом поясе. – Feuermurmel

+0

О, вы, вероятно, имели в виду 'time.gmtime(). Tm_gmtoff'! Это не работает. Он возвращает '0' в системе, которая установлена ​​в CEST. – Feuermurmel

12

От Python documentation:

classmethoddatetime.fromtimestamp (timestamp, tz=None)

Возвращения местной даты и время, соответствующее временной отметке POSIX, например, возвращается time.time(). Если необязательный аргумент tz равен None или не указан, метка времени преобразуется в локальную дату и время платформы, а возвращаемый объект datetime наив.

остальное TZ должен быть экземпляром класса tzinfo подкласса, а отметка времени преобразуется в TZ «ы часового пояса. В этом случае результат эквивалентен tz.fromutc(datetime.utcfromtimestamp(timestamp).replace(tzinfo=tz)).

Ключевая часть этого описания, как он относится к вашему вопросу, что, когда вы не указали часовой пояс, не только не использует местный часовой пояс, но результат наивного.Кажется, вы хотите, чтобы это было осведомлено.

Это особое различие, сделанное Python, и обсуждается прямо на самой вершине the datetime documentation.

Если то, что вы хотите это datetime что известно местного часового пояса, попробуйте tzlocal библиотеку. Он ориентирован на эту конкретную проблему. См. Также this question.

+1

Да, я хочу знать объект 'datetime', но я ищу способ сделать это без использования каких-либо дополнительных библиотек, поскольку Python _obviously_ уже имеет доступ к необходимой логике для вычисления правильного смещения от метки времени POSIX. – Feuermurmel

+0

Это действительно не имеет его. Он полагается на среду хоста, чтобы обеспечить перевод. Поскольку это относится к платформе, а разные платформы имеют различные реализации базы данных tz, он не может скопировать правила преобразования обратно в объект tzinfo. –

+0

Я знаю, что это так. Но через библиотеку C он получает доступ к логике, которая может назначить смещение UTC временной отметке POSIX с использованием настроек ОС (иначе код в вопросе не будет работать). – Feuermurmel

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