Python – установка даты и времени в определенном часовом поясе (без преобразований UTC)
Вопрос
Для ясности: это Python 2.6, я использую pytz.
Это для приложения, которое работает только с часовыми поясами США, мне нужно иметь возможность привязать дату (сегодня) и получить временную метку Unix (время эпохи) только для 8 вечера и 23 вечера по тихоокеанскому стандартному времени.
Это сводит меня с ума.
> pacific = pytz.timezone("US/Pacific")
> datetime(2011,2,11,20,0,0,0,pacific)
datetime.datetime(2011, 2, 11, 20, 0, tzinfo=<DstTzInfo 'US/Pacific' PST-1 day, 16:00:0 STD>)
> datetime(2011,2,11,20,0,0,0,pacific).strftime("%s")
'1297454400'
zsh> date -d '@1297454400'
Fri Feb 11 12:00:00 PST 2011
Итак, хотя я настраиваю часовой пояс и создаю дату и время с этот часовой пояс, он все еще создает его как UTC, а затем преобразует.Это большая проблема, поскольку UTC будет на день вперед, когда я пытаюсь выполнить расчеты.
Есть ли простой (или хотя бы разумный) способ создать метку времени для 8 вечера по тихоокеанскому стандартному времени сегодня?
(Чтобы внести ясность, я понимаю ценность использования UTC в большинстве ситуаций, например, для временных меток базы данных или для общего хранилища.Это не одна из таких ситуаций, мне специально нужна метка времени вечера по тихоокеанскому стандартному времени, и UTC не нужно в нее вводить.)
Решение
Создайте объект TZINFO utc
для часового пояса UTC, затем попробуйте:
#XXX: WRONG (for any timezone with a non-fixed utc offset), DON'T DO IT
datetime(2011,2,11,20,0,0,0,pacific).astimezone(utc).strftime("%s")
.
datetime
не всегда надежно.Предпочтительный метод с использованием Документация Pytz будет:
.
pacific.localize(datetime(2011,2,11,20,0,0,0)).astimezone(utc).strftime("%s")
также обратите внимание на комментарии, которые strftime("%s")
не надежен, он игнорирует информацию информацию о часовой поясе (даже UTC) и предполагает, что часовой пояс системы он работает.Он зависит от основной реализации C библиотеки C и вообще не работает на некоторых системах (например, Windows).
Другие советы
Есть как минимум две проблемы:
- вам не следует передавать часовой пояс с нефиксированным смещением UTC, например
"US/Pacific"
напрямую в качестве параметра tzinfo.Вам следует использоватьpytz.timezone("US/Pacific").localize()
метод вместо .strftime('%s')
не портативный, он игнорирует tzinfo, и он всегда использует местный часовой пояс.Использоватьdatetime.timestamp()
или его аналоги в старых версиях Python вместо.
Чтобы создать дату и время с учетом часового пояса в данном часовом поясе:
#!/usr/bin/env python
from datetime import datetime
import pytz # $ pip install pytz
tz = pytz.timezone("US/Pacific")
aware = tz.localize(datetime(2011, 2, 11, 20), is_dst=None)
Чтобы получить временную метку POSIX:
timestamp = (aware - datetime(1970, 1, 1, tzinfo=pytz.utc)).total_seconds()
(В Python 2.6 видеть totimestamp()
функция о том, как эмулировать .total_seconds()
метод).