Это просто еще один пост на pytz
.
Есть две функции для преобразования объектов datetime между двумя часовыми поясами. Вторая функция работает во всех случаях. Первая функция не работает в двух случаях (3) и (4). В аналогичном сообщении SO такой проблемы не было. Любое объяснение, основанное на разнице между localize(datetime.datetime)
и replace(tzinfo)
, будет большим подспорьем.
>>> from dateutil.parser import parse
>>> import pytz
Первая функция (глючная)
В приведенной ниже функции используется datetime.datetime.replace(tzinfo)
.
def buggy_timezone_converter(input_dt, current_tz='UTC', target_tz='US/Eastern'):
'''input_dt is a datetime.datetime object'''
current_tz = pytz.timezone(current_tz)
target_tz = pytz.timezone(target_tz)
target_dt = input_dt.replace(tzinfo=current_tz).astimezone(target_tz)
return target_tz.normalize(target_dt)
Обратите внимание на четыре преобразования даты и времени.
(1) с UTC на EST - ОК
>>> buggy_timezone_converter(parse('2013-02-26T04:00:00'))
Out[608]: datetime.datetime(2013, 2, 25, 23, 0, tzinfo=<DstTzInfo 'US/Eastern' EST-1 day, 19:00:00 STD>)
(2) от UTC до EDT - ОК
>>> buggy_timezone_converter(parse('2013-05-26T04:00:00'))
Out[609]: datetime.datetime(2013, 5, 26, 0, 0, tzinfo=<DstTzInfo 'US/Eastern' EDT-1 day, 20:00:00 DST>)
(3) с EST на UTC - не нормально. Смещение времени составляет 4 часа 56 минут. Предполагается 5 часов
>>> buggy_timezone_converter(parse('2013-02-26T04:00:00'), target_tz='UTC', current_tz='US/Eastern')
Out[610]: datetime.datetime(2013, 2, 26, 8, 56, tzinfo=<UTC>)
(4) от EDT до UTC - не нормально. Смещение времени составляет 4 часа 56 минут. Предполагается, что это будет 4 часа. Переход на летнее время не считается.
>>> buggy_timezone_converter(parse('2013-05-26T04:00:00'), current_tz='US/Eastern', target_tz='UTC')
Out[611]: datetime.datetime(2013, 5, 26, 8, 56, tzinfo=<UTC>)
Вторая функция (отлично работает)
В приведенной ниже функции используется pytz.timezone.localize(datetime.datetime)
. Работает отлично
def good_timezone_converter(input_dt, current_tz='UTC', target_tz='US/Eastern'):
current_tz = pytz.timezone(current_tz)
target_tz = pytz.timezone(target_tz)
target_dt = current_tz.localize(input_dt).astimezone(target_tz)
return target_tz.normalize(target_dt)
(1) с UTC на EST - ОК
>>> good_timezone_converter(parse('2013-02-26T04:00:00'))
Out[618]: datetime.datetime(2013, 2, 25, 23, 0, tzinfo=<DstTzInfo 'US/Eastern' EST-1 day, 19:00:00 STD>)
(2) от UTC до EDT - ОК
>>> good_timezone_converter(parse('2013-05-26T04:00:00'))
Out[619]: datetime.datetime(2013, 5, 26, 0, 0, tzinfo=<DstTzInfo 'US/Eastern' EDT-1 day, 20:00:00 DST>)
(3) с EST на UTC - ОК.
>>> good_timezone_converter(parse('2013-02-26T04:00:00'), current_tz='US/Eastern', target_tz='UTC')
Out[621]: datetime.datetime(2013, 2, 26, 9, 0, tzinfo=<UTC>)
(4) от EDT до UTC - ОК.
>>> good_timezone_converter(parse('2013-05-26T04:00:00'), current_tz='US/Eastern', target_tz='UTC')
Out[620]: datetime.datetime(2013, 5, 26, 8, 0, tzinfo=<UTC>)
>>> timezone_converter(datetime.datetime(2013,02,26,4,0,0,0), target_tz='UTC', current_tz='US/Eastern')
datetime.datetime(2013, 2, 26, 9, 0, tzinfo=<UTC>)
- person Mark Ransom   schedule 17.12.2014convert_tz_replace()
иconvert_tz()
. - person jfs   schedule 20.12.2014pytz
).timezone_converter_replace(datetime(2013,2,26,4,0,0,0), target_tz='UTC', current_tz='US/Eastern')
- ›datetime.datetime(2013, 2, 26, 8, 56, tzinfo=<UTC>)
т. Е..replace()
не выполняется, как указано в документации. - person jfs   schedule 20.12.2014