Python - Configuración de un datetime en una determinada franja horaria (sin UTC conversiones)

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

  •  12-11-2019
  •  | 
  •  

Pregunta

Para ser claros, esto es python 2.6, estoy usando pytz.

Esta es una aplicación que sólo trata con NOSOTROS de las zonas horarias, tengo que ser capaz de anclar la fecha (hoy), y obtener un timestamp de unix (epoch) para las 8 pm y las 11 de la noche en PST sólo.

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

Así que, aunque yo soy de la configuración de la zona horaria, y la creación de la datetime con que la zona horaria es todavía cree UTC y, a continuación, convertirlo.Esto es más de un problema a partir de la hora UTC será un día de anticipación cuando estoy tratando de hacer los cálculos.

Hay un fácil (o al menos sensical) para generar una marca de hora para las 8 pm PST el día de hoy?

(para ser claros, yo no entiendo el valor de uso de la UTC en la mayoría de las situaciones, la base de datos como la hora, o para almacenamiento general.Esta no es una de esas situaciones, me específicamente la necesidad de una marca de hora para la tarde-noche en el PST, y la UTC no debería tener que entrar en él.)

¿Fue útil?

Solución

Crear un objeto tzinfo utc para la zona horaria UTC, a continuación, 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")

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

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

También nota de los comentarios que strftime("%s") no es confiable, ignora la información de zona horaria (incluso UTC) y se supone que el tiempo de la zona de el sistema está funcionando.Se basa en una biblioteca de C de la aplicación y no funciona en todos, en algunos sistemas (por ejemplo,De Windows).

Otros consejos

Hay al menos dos cuestiones:

  1. usted no debería pasar de una zona horaria con la no-fijo desplazamiento de UTC, tales como "US/Pacific" como tzinfo parámetro directamente.Usted debe uso pytz.timezone("US/Pacific").localize() método en su lugar
  2. .strftime('%s') no es portable, ignora tzinfo, y siempre se utiliza la zona horaria local.Uso datetime.timestamp() o sus análogos en anteriores versiones de Python en su lugar.

Para hacer una zona horaria-consciente datetime en la zona horaria:

#!/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 POSIX marca de tiempo:

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

(En Python 2.6, ver totimestamp() función de cómo emular .total_seconds() método).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top