2015-06-17 5 views
5

Я пишу сценарий питона, который содержит две строки кода, превращающего дату, когда был принят в метод времени UTC:Неправильный временной интервал Python?

print "Timezone: %s" % get_localzone() 
date = datetime.now(tz=get_localzone()) 
print "Local time: %s" % date 
utc = pytz.utc 
utc_date = date.astimezone(utc) 
print "UTC date: %s" % utc_date 

и результат:

Timezone: America/Chicago 
Local time: 2015-06-17 14:58:45.224827-05:00 
UTC date: 2015-06-17 19:58:45.224827+00:00 

Как вы можете см смещение в локальное время «-05: 00», ничего плохого с ним, но когда я создаю пользовательский объект DATETIME с таким же часовым поясом:

date = datetime(2015, 6, 17, 14, 58, 45, tzinfo=get_localzone()) 

результатом стал с:

Timezone: America/Chicago 
Local time: 2015-06-17 14:58:45-05:51 

Смещение изменено с «-05: 00» на «-05: 51». Я даже использовал то же время, что и первый «datetime.now()», и часовой пояс не изменился, кто-нибудь, пожалуйста, объясните мне, почему это происходит? Благодаря!

ответ

8

Вместо назначения параметра tzinfo используйте метод localize из pytz.

tz = get_localzone() 
date = tz.localize(datetime(2015, 6, 17, 14, 58, 45)) 

Это обсуждается заметно в the pytz documentation, начиная с первого «Примечание» поле, а в самом первом образце кода.

Это также показано в the tzlocal documentation, где (я полагаю) ваш метод get_localzone() исходит от.

FYI, то -05:51 смещение происходит от первоначальной LMT стоимости America/Chicago часового пояса, который является -05:50:36 и, как предполагается, были в эксплуатации еще в 1883 году as shown here. Он округляется до ближайшей минуты, давая значение LMT -05:51 в Python. Вы видите это смещение, потому что метод localize не был вызван, поэтому pytz использует только первое смещение, известное для этой записи в часовом поясе.

+0

Спасибо за подробный ответ, он решил мою проблему :) –

+1

@YueQiLi: note: вы должны использовать 'datetime.now (tz)' вместо 'tz.localize (datetime.now())'. Последнее может завершиться неудачей, если локальное время неоднозначно (например, во время перехода на летнее время). Если время ввода не сейчас, вы можете передать параметр 'is_dst' в' tz.localize() ', чтобы устранить неоднозначность. – jfs

+0

@ J.F.Sebastian Спасибо, я просто взглянул на [документацию pytz] (http://pythonhosted.org/pytz/), и вы правы, я добавлю это в свой код. О другом подобном вопросе, несмотря на то, что обе наши проблемы вызваны неправильным использованием конструктора datetime, для начинающих, как я, все равно трудно классифицировать их в одну и ту же проблему. Сохранение моей будет полезно для других людей, чтобы избежать такой ошибки новобранец :) –

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