pytz: Почему эти разные методы дают разные смещения UTC? - PullRequest
3 голосов
/ 22 марта 2011

При создании объекта datetime в определенном часовом поясе с помощью pytz я получаю другое смещение UTC в зависимости от того, что я использую datetime.datetime() или datetime.datetime.now().

now(), кажется, дает правильное значениеСмещение UTC для часового пояса, datetime() дает смещение, которое я не распознаю.

Почему они разные?Каково значение смещения, которое присваивает datetime()?

Вот мой код:

import datetime
import pytz

la_paz = pytz.timezone('America/La_Paz')

a = datetime.datetime.now(la_paz)
print a, a.utcoffset()

# 2011-03-22 05:30:13-04:00 -1 day, 20:00:00
# -4 hours is the correct UTC offset for La Paz

b = datetime.datetime(2011, 03, 22, 5, 30, tzinfo=la_paz)
print b, b.utcoffset()

# 2011-03-22 05:30:00-04:33 -1 day, 19:27:00
# What is the significance of -4:33?

Ответы [ 2 ]

2 голосов
/ 19 мая 2011

Из документации pytz :

Эта библиотека поддерживает только два способа построения локализованного времени. Первый - использовать метод localize (), предоставляемый библиотекой pytz. Это используется для локализации наивного даты-времени (дата-время без информации о часовом поясе):

>>> loc_dt = eastern.localize(datetime(2002, 10, 27, 6, 0, 0))
>>> print loc_dt.strftime(fmt)
2002-10-27 06:00:00 EST-0500

Второй способ построения локализованного времени - преобразование существующего локализованного времени с использованием стандартного метода astimezone ():

>>> ams_dt = loc_dt.astimezone(amsterdam)
>>> ams_dt.strftime(fmt)
'2002-10-27 12:00:00 CET+0100'

Или, говоря по-другому:

b = datetime.datetime(2011, 03, 22, 5, 30, tzinfo=la_paz)

Не поддерживается pytz

2 голосов
/ 22 марта 2011

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

Вместо этого должно быть указано время и датасозданный наивный и затем локализованный следующим образом:

b = la_paz.localize(datetime.datetime(2011, 03, 22, 5, 30))
print b, b.utcoffset()

now(), кажется, выполняет локализацию автоматически.

...