Python - установка даты и времени в определенном часовом поясе (без конвертации в UTC) - PullRequest
17 голосов
/ 12 февраля 2011

Просто чтобы прояснить, это 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не должно входить в это.)

Ответы [ 2 ]

14 голосов
/ 12 февраля 2011

Создайте объект 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")

Редактировать: Как указано в комментариях, поместить часовой пояс в *Конструктор 1007 * не всегда надежен.Предпочтительный метод с использованием документации pytz будет выглядеть следующим образом:

pacific.localize(datetime(2011,2,11,20,0,0,0)).astimezone(utc).strftime("%s")

Также отметьте в комментариях, что strftime("%s") не надежен, он игнорирует часовой поясинформация (даже UTC) и предполагает часовой пояс системы, в которой она работает.Он опирается на базовую реализацию библиотеки C и совсем не работает в некоторых системах (например, Windows).

13 голосов
/ 04 сентября 2014

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

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

Toполучить POSIX timestamp:

timestamp = (aware - datetime(1970, 1, 1, tzinfo=pytz.utc)).total_seconds()

(На Python 2.6 см. функцию totimestamp() о том, как эмулировать .total_seconds() метод ).

...