2016-07-20 1 views
1

У меня есть строка даты, которая выглядит так: Tue Jul 19 2016 14:00:00 GMT-0700 (PDT). Есть ли библиотека или функция, которая могла бы сделать что-то вроде этого?Как получить часовой пояс из строки datetime в python?

print get_tz('Tue Jul 19 2016 14:00:00 GMT-0700 (PDT)') 
'US/Pacific' 
+0

Возможный дубликат http://stackoverflow.com/questions/3489183/how-can-i-get-a-human-readable-timezone -name-in-python –

+0

@JohnGordon: Разница в том, что в вашем вопросе речь идет о системном часовом поясе, тогда как это занимает часовой пояс из строки. – zondo

+0

Вы могли бы попробовать использовать регулярное выражение и искать слово GMT, может быть? – ChaoticTwist

ответ

2

В общем, вам нужно быть осторожным при сопоставлении сокращений часового пояса с идентификаторами часового пояса. Не существует сопоставления «один-к-одному». Например, CST может быть центральным стандартным временем, стандартным временем в Китае или стандартным временем Кубы.

Поскольку у вас есть как смещение, так и аббревиатура, вы можете улучшить его немного дальше, но у вас все еще будут двусмысленности. Например, если строка содержит GMT+02:00 (EET), это может быть любой из the locations listed here, некоторые из которых используют EET круглый год, другие из которых используют EET зимой и EEST летом. Из тех, кто использует EEST, не все из них начинаются и заканчиваются одновременно.

В каждом варианте создается другой идентификатор часового пояса. Например, Europe/Bucharest, Europe/Istanbul, Europe/Chisinau и Asia/Amman, все используют EET и EEST, но все имеют несколько разные даты или времена перехода.

Даже если текущие переходы совпадают, возможно, они отличались исторически. Например, Europe/Athens и Europe/Helsinki могут выглядеть одинаково на первый, пока вы считаете, что Хельсинки не наблюдали EEST в 1980 году

Эти проблемы будут влиять на любую библиотеку или функцию, которая пытается решить часового пояса сокращения и/или смещения в определенные часовые пояса, независимо от языка программирования.

+0

Итак, хотя «сокращения зон» остаются двусмысленными, я считаю их «более приятными» и не на что-то полагаться на правильное время. Считаете ли вы, что каждый раз можно получить правильное время, используя 'timezone offset', а затем просто использовать аббревиатуру в конце, как что-то там для хорошего форматирования? –

+0

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

+0

Итак, в основном мы отправляем дату в этой форме 'Tue Jul 19 2016 14:00:00 GMT-0700 (PDT)' от клиента. Это дает нам точное считывание смещения каждый раз на сервере, потому что оно отправляется от клиента. Поэтому, имея в виду, будет ли это работать так, как я этого хочу? –

1

Я согласен с @MattJohnson, что вам нужно быть очень осторожным при анализе коротких имен часовых поясов на tzinfo объектов. Однако, если у вас есть конкретный контекст, где имеет смысл только одно чтение (например, вы обрабатываете временные метки, созданные в Соединенных Штатах), вы можете использовать аргумент tzinfos для функции python-dateutilparse.

Вот пример того, как она используется:

from dateutil import tz 
from dateutil.parser import parse 

ET = tz.gettz('US/Eastern') 
CT = tz.gettz('US/Central') 
MT = tz.gettz('US/Mountain') 
PT = tz.gettz('US/Pacific') 

us_tzinfos = {'CST': CT, 'CDT': CT, 
       'EST': ET, 'EDT': ET, 
       'MST': MT, 'MDT': MT, 
       'PST': PT, 'PDT': PT} 

dt_est = parse('2014-01-02 04:00:00 EST', tzinfos=us_tzinfos) 
# >>> dt_est.tzinfo 
# tzfile('/usr/share/zoneinfo/US/Eastern') 

dt_pst = parse('2016-03-11 16:00:00 PST', tzinfos=us_tzinfos) 
# >>> dt_pst.tzinfo 
# tzfile('/usr/share/zoneinfo/US/Pacific') 
Смежные вопросы