Что мне нужно сделать
У меня есть объект datetime без учета часового пояса, к которому мне нужно добавить часовой пояс, чтобы иметь возможность сравнивать его с другими объекты даты и времени с учетом часового пояса. Я не хочу преобразовывать все мое приложение в часовой пояс без учета этого одного устаревшего случая.
Что я пробовал
Во-первых, чтобы продемонстрировать проблему :
Python 2.6.1 (r261:67515, 24 июня 2010 г., 21:47:49) [GCC 4.2.1 (Apple Inc., сборка 5646)] на darwin Введите "help" , "авторское право", "кредиты" или "лицензия" для получения дополнительной информации >>> import datetime >>> import pytz >>> ,15,8,15,12,0) >>> не знаю datetime.datetime(2011, 8, 15, 8, 15, 12) >>> 15,8,15,12,0,pytz.UTC) >>> осведомлены == не осведомлены Traceback (последний последний вызов): файл "<stdin>", строка 1, в <module> TypeError: не может сравнивать дату и время без смещения и с учетом смещения
Сначала я попробовал astimezone:
>>> unaware.astimezone(pytz.UTC) Трассировка (последний последний вызов): Файл "<stdin>", строка 1, в <module> ValueError: astimezone() нельзя применить к наивному дате и времени >>>
Неудивительно, что это не удалось, поскольку на самом деле он пытается выполнить преобразование. Замена казалась лучшим выбором (согласно Как мне получить значение datetime.today() в Python, которое "с учетом часового пояса"?):
>>> unaware.replace(tzinfo=pytz.UTC) datetime.datetime(2011, 8, 15, 8, 15, 12, tzinfo=<UTC>) >>> незнание == известно Трассировка (самый последний вызов последним): Файл "<stdin>", строка 1, в <module> TypeError: не удается сравнить дату и время без смещения и с учетом смещения >>>
Но, как вы можете видеть, замена, похоже, устанавливает tzinfo, но не делает объект осведомленным . Я готов вернуться к обработке входной строки, чтобы указать часовой пояс перед ее синтаксическим анализом (я использую dateutil для синтаксического анализа, если это имеет значение), но это кажется невероятно неуклюжим.
Кроме того, Я пробовал это как в Python 2.6, так и в Python 2.7 с одинаковыми результатами.
Контекст
Я пишу анализатор для некоторых файлов данных. Мне нужно поддерживать старый формат, в котором строка даты не имеет индикатора часового пояса. Я уже исправил источник данных, но мне все еще нужно поддерживать устаревший формат данных. Однократное преобразование устаревших данных не вариант по различным бизнес-причинам. Хотя в целом мне не нравится идея жесткого - кодирование часового пояса по умолчанию, в данном случае это кажется лучшим вариантом. Я с достаточной уверенностью знаю, что все устаревшие данные, о которых идет речь, находятся в формате UTC, поэтому я готов принять риск по умолчанию в этом случае.