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()).