python – datetime con zona horaria hasta la época

En el siguiente código, estoy calculando la época y el comienzo de la época actual.

import time import pytz from datetime import datetime tz1 = pytz.timezone('CST6CDT') utc = pytz.timezone('UTC') now = pytz.UTC.localize(datetime.utcnow()) now_tz = now.astimezone(tz1) print now_tz print now_tz.strftime('%s') begin_day = now_tz.replace(hour=0, minute=0, second=0) print begin_day print begin_day.strftime('%s') 

imprimir declaraciones:

 2012-08-28 13:52:21.595718-05:00 1346187141 2012-08-28 00:00:00.595718-05:00 1346137200 

Conversión de épocas a marca de tiempo con zona horaria de CDT: 1346187141 – 28 de agosto de 2012 15:52:21, 1346137200 – 28 de agosto de 2012 02:00:00

Me gustaría que la segunda época sea el comienzo del día, pero son las 2 de la mañana. Parece que todavía está usando el PST de zona horaria local cuando se convierte a la época.

Qué estoy haciendo mal ? ¿O puede hacerse esto de una manera diferente?

¡Gracias!

NOTA: Mi respuesta es totalmente errónea. (Me gustaría eliminarlo, pero no puedo hacerlo hasta que se elimine el indicador de aceptación).

Por favor vea la respuesta de JFSebastian .

Aquí está el código que demuestra un valor de now_tz para el cual nuestros dos métodos producen resultados diferentes.

 import calendar import pytz import datetime as dt tz1 = pytz.timezone('US/Eastern') utc = pytz.timezone('UTC') now = utc.localize(dt.datetime(2002, 10, 28), is_dst=None) now_tz = now.astimezone(tz1) now_epoch = calendar.timegm(now_tz.utctimetuple()) begin_day = tz1.normalize(now_tz.replace(hour=0, minute=0, second=0)) midnight = tz1.localize(dt.datetime.combine(now_tz, dt.time(0, 0)), is_dst=None) if begin_day != midnight: print(begin_day) # 2002-10-27 01:00:00-04:00 # my result -- is not midnight print(midnight) # 2002-10-27 00:00:00-04:00 # JFSebastian's result is correct 

(Respuesta original redactada)

Para convertir una fecha y hora con zona horaria a época (marca de tiempo POSIX):

 from datetime import datetime import pytz tz = pytz.timezone('CST6CDT') # a datetime with timezone dt_with_tz = tz.localize(datetime(2012, 8, 28, 19, 33, 50), is_dst=None) # get timestamp ts = (dt_with_tz - datetime(1970, 1, 1, tzinfo=pytz.utc)).total_seconds() # -> 1346200430.0 

Es la forma en que se implementa el método datetime.timestamp para los objetos datetime conscientes de la zona horaria en Python 3.

Para obtener “ahora la época”:

 from datetime import datetime now_epoch = (datetime.utcnow() - datetime(1970, 1, 1)).total_seconds() 

O (asumiendo que el time utiliza la época POSIX):

 import time now_epoch = time.time() 

Obtener “el comienzo de la época del día actual” es más complejo porque el día actual puede ser diferente en diferentes zonas horarias:

 from datetime import datetime, time import pytz tz = pytz.timezone('CST6CDT') # get current date in given timezone today = datetime.now(tz).date() # -> datetime.date(2013, 6, 22) # get beginning of current day in given timezone as a datetime with timezone midnight = tz.localize(datetime.combine(today, time(0, 0)), is_dst=None) # -> datetime.datetime(2013, 6, 22, 0, 0, tzinfo=) # get timestamp ts = (midnight - datetime(1970, 1, 1, tzinfo=pytz.utc)).total_seconds() # -> 1371877200.0 

Consulte ¿Cómo obtengo la hora UTC de “medianoche” para una zona horaria determinada? .

Para obtener el “comienzo de la época del día actual” asumiendo la fecha UTC:

 from datetime import datetime, date # get current date in UTC utc_date = datetime.utcnow().date() # -> datetime.date(2013, 6, 23) # get timestamp ts = (utc_date - date(1970, 1, 1)).days * 86400 # -> 1371945600 

Consulte Conversión de datetime.date/datetime.datetime en la marca de hora UTC en Python .

la última versión de simple-date (versión 0.2 en pypi ) administrará los detalles por usted:

 >>> from simpledate import * >>> now_utc = SimpleDate(tz='UTC') >>> now_tz = now_utc.convert(tz='CST6CDT') >>> begin_day = now_tz.replace(hour=0, minute=0, second=0, microsecond=0) >>> now_utc.timestamp 1371950295.777453 >>> now_tz.timestamp 1371950295.777453 >>> begin_day.timestamp 1371877200.0 

podemos ir hacia atrás para verificar las marcas de tiempo (aunque está claro que el cambio de zona horaria no cambió la época, mientras que pasar al comienzo del día sí):

 >>> SimpleDate(1371877200.0, tz='CST6CDT') SimpleDate('2013-06-22 00:00:00.000000 CDT', tz='CST6CDT') >>> SimpleDate(1371877200.0, tz='UTC') SimpleDate('2013-06-22 05:00:00.000000 UTC')