create python datetime pst pytz

create - set utc python



Python: configuración de una fecha y hora en una zona horaria específica(sin conversiones UTC) (2)

Para que quede claro, esto es Python 2.6, estoy usando pytz.

Esto es para una aplicación que solo trata con las zonas horarias de los EE. UU. Necesito poder anclar una fecha (hoy) y obtener una marca de tiempo de Unix (hora de la época) solo para las 8 p.m. y las 11 p.m. en PST.

Esto me está volviendo loco.

> 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

Entonces, aunque estoy configurando una zona horaria y creando la fecha y hora con esa zona horaria, todavía la está creando como UTC y luego la está convirtiendo. Esto es más un problema ya que UTC estará un día por delante cuando esté tratando de hacer los cálculos.

¿Existe una manera fácil (o al menos sensata) de generar una marca de tiempo para las 8 pm PST de hoy?

(para ser claro, entiendo el valor de usar UTC en la mayoría de las situaciones, como las marcas de tiempo de la base de datos o para el almacenamiento general. Esta no es una de esas situaciones, específicamente necesito una marca de tiempo para la noche en PST, y UTC no debería tener que entrar en ella)


Cree un objeto tzinfo utc para la zona horaria UTC, luego intente esto:

#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")

Edición: como se señaló en los comentarios, poner la zona horaria en el constructor de datetime no siempre es robusto. El método preferido usando la documentación de pytz sería:

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

También tenga en cuenta que en los comentarios que strftime("%s") no es confiable, ignora la información de la zona horaria (incluso UTC) y asume la zona horaria del sistema en el que se está ejecutando. Se basa en una implementación de la biblioteca C subyacente y no funciona en absoluto en algunos sistemas (por ejemplo, Windows).


Hay al menos dos problemas:

  1. no debe pasar una zona horaria con un desplazamiento UTC no fijo como "US/Pacific" como parámetro tzinfo directamente. Debería usar el pytz.timezone("US/Pacific").localize() lugar
  2. .strftime(''%s'') no es portátil, ignora tzinfo y siempre usa la zona horaria local. Use datetime.timestamp() o sus análogos en versiones anteriores de Python .

Para establecer una fecha y hora con fecha horaria en la zona horaria determinada:

#!/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)

Para obtener la marca de tiempo POSIX:

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

(En Python 2.6, vea la función totimestamp() sobre cómo emular el método .total_seconds() ).