create - timedelta python example
Determine la hora de inicio y finalización del día actual(UTC-> EST-> UTC); Pitón (6)
Definitivamente le daría una mirada a Delorean , para resolver su problema seguiría algunos pasos.
Primero necesitas analizar tu cadena. Excelente uso del método de parse Delorean.
>>> from delorean import parse
>>> d = parse("Wed, 20 Feb 2013 03:51:39 +0000")
>>> d
Delorean(datetime=2013-02-20 03:51:39+00:00, timezone=UTC)
Una vez que tenga la fecha y hora que analizó en un objeto Delorean, simplemente la convierte a EST
>>> d = d.shift(''US/Eastern'')
>>> d
Delorean(datetime=2013-02-19 22:51:39-05:00, timezone=US/Eastern)
Aunque sin sentido. Nunca lo usas para nada en tu pregunta, pero es muy fácil con Delorean.
Entonces tienes el tiempo ahora en EST
de delorean import Delorean
>>> d1 = Delorean(timezone="US/Eastern")
>>> d1
Delorean(datetime=2013-02-21 00:35:56.405256-05:00, timezone=US/Eastern)
Ahora para el paso de truncation .
>>> d.truncate(''day'')
Delorean(datetime=2013-02-21 00:00:00-05:00, timezone=US/Eastern)
hacer el simple cambio de arriba a UTC.
Ahora consigue el final del día.
d = d.next_day(1) # move to the next day
Luego para retroceder un segundo. Algo que la biblioteca necesita, estaré actualizando esto. Simplemente obtenga la fecha y hora del ejemplo de Delorean
solicitándola con el atributo datetime
y datetime
.
d.datetime - timedelta(seconds=1)
datetime.datetime(2013, 2, 21, 23, 59, 59, tzinfo=<DstTzInfo ''US/Eastern'' EST-1 day, 19:00:00 STD>)
Buena suerte, pero esta biblioteca debería simplemente tratar con operaciones de fecha y hora :)
Estoy almacenando todos mis tiempos en UTC y mi sistema está configurado en UTC (aunque estoy en EST).
Tengo las fechas almacenadas como:
Wed, 20 Feb 2013 03:51:39 +0000
Sin embargo, me gustaría seleccionar información basada hoy en día para EST, por lo que estoy intentando:
Obtener la hora actual como UTC y cambiar a EST
datetime.utcnow().replace(tzinfo=tz.tzutc()).astimezone(tz.gettz(''America/New_York'')) 2013-02-19 23:17:20.560898-05:00
A continuación, deseo obtener la hora de inicio para el día EST (2013-02-19 00: 00: 00.000000-05: 00) y la hora de finalización (2013-02-19 23: 59: 59.99999-05: 00)
Una vez que tenga esos valores, me gustaría volver a convertirlos a UTC, así que tengo un valor alto y bajo que puedo controlar, y así es mi EST (mi zona horaria) correcta.
Si esta no es la mejor manera de hacerlo, o si me falta algo (me parece demasiado complicado), ¡ayúdeme a ver la luz!
TIA
Actualización por respuesta:
d1 = datetime.utcnow().replace(tzinfo=tz.tzutc()).astimezone(tz.gettz(''America/New_York''))
print d1.strftime("%m %d %Y") ; d2 = d1.replace(day=d1.day + 1) ; print d2.strftime("%m %d %Y")
Eso me dara
02 20 2013
02 21 2013
Cual es correcta. Ahora necesito generar el tiempo completo de EST a partir de eso y luego convertirlo a UTC. Esto no lo puedo entender. En realidad, es probable que quiera convertir a la marca de tiempo de la época UTC cuando esté completo porque eso hará que las operaciones de mi base de datos sean bastante fáciles (<,>, ==, etc.).
El primer paso para obtener la hora actual como UTC y convertirla a EST parece un poco inútil. ¿Usas ese tiempo para algo?
Aparte de eso, parece bastante sencillo. Desea obtener el inicio y el final de un día EST en UTC, por lo que los crea y los convierte a UTC. Eso no es tan complicado. :-)
Sin embargo, es posible que desee ver sus rutinas coincidentes, de modo que pueda usar el comienzo de hoy como el valor más bajo y el comienzo de mañana como el más alto, para que no tenga que lidiar con ese tiempo 23: 59: 59.9999 .
Actualizar:
Desde mi comprensión original de tu pregunta, esto es lo que quieres hacer:
Primero desea obtener la fecha actual tal como está en UTC (por lo tanto, a las 11 pm EST del 12, quiere el 22, ya que es el 22 en UTC en ese momento).
>>> from datetime import datetime
>>> today = datetime.utcnow().date()
>>> today
datetime.date(2013, 2, 21)
En segundo lugar, desea 00:00:00 de ese día en UTC, como inicio para una búsqueda.
>>> from dateutil import tz
>>> start = datetime(today.year, today.month, today.day, tzinfo=tz.tzutc())
datetime.datetime(2013, 2, 21, 0, 0, tzinfo=tzutc())
Excepto que quieres saber qué hora es en Nueva York:
>>> from dateutil import tz
>>> est = tz.gettz(''America/New_York'')
>>> start = start.astimezone(est)
>>> start
datetime.datetime(2013, 2, 20, 19, 0, tzinfo=tzfile(''/usr/share/zoneinfo/America/New_York''))
Y también quieres mañana como final:
>>> from datetime import timedelta
>>> end = start + timedelta(1)
>>> end
datetime.datetime(2013, 2, 21, 19, 0, tzinfo=tzfile(''/usr/share/zoneinfo/America/New_York''))
Resumen:
today = datetime.utcnow().date()
start = datetime(today.year, today.month, today.day, tzinfo=tz.tzutc()).astimezone(est)
end = start + timedelta(1)
Esta es solo una respuesta parcial, porque el resto ha sido bien cubierto. Luché con esto por un tiempo, ya que algunas tecnologías tienen búsquedas inclusivas, y no quiero incluir ningún dato del primer microsegundo del día siguiente.
Mi solución para encontrar el final del día de manera rápida y correcta es esta:
reference_time.replace(hour=0, minute=0, second=0, microsecond=0) + timedelta(days=1,microseconds=-1)
La pregunta es vieja pero quizás esto ayude:
import datetime
end_of_today = datetime.datetime.combine(datetime.datetime.today(), datetime.time(23, 59, 59, 999999))
Solo encontré esto, aquí está la opción más simple que encontré:
from delorean import Delorean
today_d = Delorean()
sod_dt = today_d.start_of_day
eod_dt = today_d.end_of_day
sod_d = Delorean(sod_dt)
eod_d = Delorean(eod_dt)
sod_e = sod_d.epoch
eod_e = eod_d.epoch
para confirmar:
In [69]: eod_e - sod_e
Out[69]: 86399.99999904633
lo suficientemente cerca para la mayoría de la gente
use datetime
pytz
resolverá su problema.
def get_start_and_end():
tz = pytz.timezone(''Asia/Shanghai'')
today = datetime.now(tz=tz)
start = today.replace(hour=0, minute=0, second=0, microsecond=0)
end = start + timedelta(1)
return start, end