Determine la hora de inicio y finalización del día actual (UTC -> EST -> UTC); Pitón

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:

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) 

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 análisis de 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 truncamiento .

 >>> 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=) 

Buena suerte, pero esta biblioteca debería simplemente tratar con operaciones de fecha y hora 🙂

Esta es solo una respuesta parcial, porque el rest 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) 

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 

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))