python datetime.datetime не возвращает правильную информацию о часовом поясе с переходом на летнее время - PullRequest
2 голосов
/ 07 июля 2011

У меня проблема с созданием дат в python, поскольку в некоторых сценариях даты, которые я создаю, не учитывают переход на летнее время.

Например, если я иду к своей оболочке и запускаю

>>> adjust_datetime_to_timezone(value=datetime.datetime.now(), from_tz=timezone('UTC'), to_tz=timezone('US/Pacific'))
datetime.datetime(2011, 7, 7, 12, 41, 16, 337918, tzinfo=<DstTzInfo 'US/Pacific' PDT-1 day, 17:00:00 DST>)

Я получаю правильное время.

Я хочу создать дату, которая является началом текущей даты, поэтому я запускаю:

>>> datetime.datetime(year=2011, month=7, day=7,  tzinfo=timezone('US/Pacific'))
datetime.datetime(2011, 7, 7, 0, 0, tzinfo=<DstTzInfo 'US/Pacific' PST-1 day, 16:00:00 STD>)

Обратите внимание, что это дата PST, потому что когда я конвертирую ее в UTC:

>>> adjust_datetime_to_timezone(datetime.datetime(year=2011, month=7, day=7,  tzinfo=timezone('US/Pacific')), from_tz=timezone('US/Pacific'), to_tz=timezone('UTC')) datetime.datetime(2011, 7, 7, 8, 0, tzinfo=<UTC>)

Обратите внимание, что 07/07/2011 08:00 AM UTC, что на самом деле 01:00 AM PDT.

Кто-нибудь знает, почему python будет давать мне PST-даты для конструктора datetime.datetime, а не для Adjust_datetime_to_timezone?

1 Ответ

2 голосов
/ 08 июля 2011

Поскольку я вижу <DstTzInfo 'US/Pacific' PST-1 day, 16:00:00 STD>, похоже, вы используете pytz.В этом случае вы можете использовать метод localize для создания часовых поясов с учетом часового пояса, скорректированных на летнее время.(Избегайте использования аргумента datetime.datetime tzinfo, поскольку он не настраивается на летнее время.)

import pytz
import datetime as dt

now=dt.datetime(year=2011, month=7, day=7)
utc=pytz.utc
pacific=pytz.timezone('US/Pacific')    
now_pacific=pacific.localize(now)    
now_utc=now_pacific.astimezone(utc)

print(repr(now_pacific))
# datetime.datetime(2011, 7, 7, 0, 0, tzinfo=<DstTzInfo 'US/Pacific' PDT-1 day, 17:00:00 DST>)
print(repr(now_utc))
# datetime.datetime(2011, 7, 7, 7, 0, tzinfo=<UTC>)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...