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)