python - часы - pytz




Python-установка даты и времени в определенном часовом поясе(без конвертации в UTC) (2)

Просто чтобы быть ясно, это 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

Поэтому, хотя я настраиваю часовой пояс и создаю дату и время с этим часовым поясом, он все равно создает его как UTC, а затем преобразовывает его. Это большая проблема, так как UTC будет на день вперед, когда я попытаюсь сделать расчеты.

Есть ли простой (или, по крайней мере, чувственный) способ создать временную метку для 8 вечера PST сегодня?

(чтобы быть ясным, я понимаю ценность использования UTC в большинстве ситуаций, таких как отметки времени базы данных или для общего хранения. Это не одна из тех ситуаций, мне специально нужна отметка времени для вечера в PST, и UTC не должно войти в это.)


Есть как минимум две проблемы:

  1. Вы не должны передавать часовой пояс с нефиксированным смещением UTC, например, "US/Pacific" в качестве параметра tzinfo напрямую. pytz.timezone("US/Pacific").localize() вы должны использовать pytz.timezone("US/Pacific").localize()
  2. .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() ).


Создайте объект 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 и совсем не работает в некоторых системах (например, Windows).





pytz