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:
- no debe pasar una zona horaria con un desplazamiento UTC no fijo como
"US/Pacific"
como parámetro tzinfo directamente. Debería usar elpytz.timezone("US/Pacific").localize()
lugar -
.strftime(''%s'')
no es portátil, ignora tzinfo y siempre usa la zona horaria local. Usedatetime.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()
).