proyectos ejemplos python datetime timezone epoch

ejemplos - python-datetime con zona horaria a época



django (3)

el último lanzamiento de fecha simple (versión 0.2 en pypi ) administrará los detalles para 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 arriba que cambiar de zona horaria no cambió la época, mientras que cambiar al inicio 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'')

En el siguiente código, estoy calculando ahora la época y el comienzo de la época del día 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 hora con zona horaria CDT: 1346187141 - 28 de agosto de 2012 15:52:21, 1346137200 - 28 de agosto de 2012 a las 02:00:00

Me gustaría que la segunda época sea el comienzo del día, pero son las 2 a. M. Parece que todavía está utilizando PST de zona horaria local al convertir a época.

Qué estoy haciendo mal ? o puede hacerse de otra manera?

¡Gracias!


Para convertir un datetime con timezone a epoch (POSIX timestamp):

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 así como se implementa el método datetime.timestamp para los objetos datetime reconocimiento de zona horaria en Python 3.

Para obtener "ahora época":

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

O (suponiendo que el time use POSIX epoch):

import time now_epoch = time.time()

Obtener "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=<DstTzInfo ''CST6CDT''...>) # 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 "comienzo de la época del día actual" suponiendo 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 Convertir datetime.date/datetime.datetime en la marca de tiempo UTC en Python .


NOTA: Mi respuesta es totalmente incorrecta. (Me gustaría eliminarlo, pero no puedo hacerlo hasta que se elimine la marca 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 # J.F.Sebastian''s result is correct

(Respuesta original redactada)