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

StackOverflow https://stackoverflow.com/questions/4974712

  •  12-11-2019
  •  | 
  •  

Вопрос

Для ясности: это 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).

Другие советы

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

  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)

Чтобы получить временную метку POSIX:

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top