Python - настройка даты и времени в определенном часовом поясе (без конверсий по UTC)
Просто, чтобы быть ясным, это python 2.6, я использую pytz.
Это приложение, которое касается только часовых поясов США, мне нужно укрепить дату (сегодня) и получить временную отметку unix (время в эпоху) в течение 8 вечера и 11 вечера только в PST.
Это сводит меня с ума.
> 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
Итак, хотя я настраиваю часовой пояс и создаю datetime с этим часовым поясом, он все еще создает его как UTC, а затем конвертирует его. Это больше проблема, так как UTC будет на следующий день, когда я попытаюсь выполнить вычисления.
Есть ли простой (или, по крайней мере, чувствительный) способ генерации метки времени для 8 вечера PST сегодня?
(чтобы быть ясным, я понимаю значение использования UTC в большинстве ситуаций, таких как отметки времени базы данных или для общего хранилища. Это не одна из этих ситуаций, мне особенно нужна отметка времени для вечера в PST, а UTC следует не нужно входить в него.)
Ответы
Ответ 1
Создайте объект 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 documentation:
#XXX: WRONG (unless your local timezone is UTC), DON'T DO IT
pacific.localize(datetime(2011,2,11,20,0,0,0)).astimezone(utc).strftime("%s")
Ответ 2
Есть как минимум две проблемы:
Чтобы создать дату и время, относящиеся к часовому поясу, в данном часовом поясе:
#!/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()
).