web-dev-qa-db-fra.com

Déterminez l'heure de début et de fin du jour actuel (UTC -> EST -> UTC); Python

Je stocke tous mes temps en UTC et mon système est défini sur UTC (bien que je sois en EST).

J'ai des dates stockées comme:

Wed, 20 Feb 2013 03:51:39 +0000

Cependant, je voudrais sélectionner des informations basées sur la base d'aujourd'hui pour EST, donc je tente de:

  • Obtenir l'heure actuelle en UTC et passer à EST

    datetime.utcnow().replace(tzinfo=tz.tzutc()).astimezone(tz.gettz('America/New_York'))
    2013-02-19 23:17:20.560898-05:00
    
  • Ensuite, je souhaite connaître l'heure de début du jour de l'EST (2013-02-19 00: 00: 00.000000-05: 00) et l'heure de fin (2013-02-19 23: 59: 59.99999-05: 00)

  • Une fois que j'ai obtenu ces valeurs, j'aimerais reconvertir en UTC afin d'avoir une valeur haute et basse que je peux bloquer, ce qui correspond à mon EST (mon fuseau horaire).

Si ce n'est pas la meilleure façon de faire cela, ou s'il me manque quelque chose (cela me semble trop compliqué), aidez-moi à voir la lumière!

TIA

Mise à jour par réponse:

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

Ça me donnera 

02 20 2013
02 21 2013

Qui est correct. Je dois maintenant générer le temps EST complet à partir de cela, puis convertir au format UTC. C'est ce que je n'arrive pas à comprendre. En fait, je souhaite probablement convertir le timestamp UTC Epoch une fois terminé, car cela facilitera considérablement les opérations de ma base de données (<,>, ==, etc.).

16
mr-sk

La première étape pour obtenir l'heure UTC actuelle et la convertir en EST semble un peu inutile. Utilisez-vous ce temps pour quelque chose?

Cela mis à part, cela semble plutôt simple. Vous voulez obtenir le début et la fin de la journée de la journée en UTC, vous devez donc les créer et les convertir en UTC. Ce n'est pas si compliqué. :-)

Cependant, vous voudrez peut-être examiner vos routines de correspondance pour pouvoir utiliser le début d'aujourd'hui comme la valeur la plus basse et le début de demain comme le plus élevé. .

Mettre à jour:

D'après ma compréhension initiale de votre question, voici ce que vous voulez faire:

Vous souhaitez d’abord obtenir la date du jour telle qu’elle se trouve en UTC (donc à midi le 12, vous voulez le 22, puis le 22 à UTC).

>>> from datetime import datetime
>>> today = datetime.utcnow().date()
>>> today
datetime.date(2013, 2, 21)

Deuxièmement, vous voulez 00:00:00 ce jour-là en UTC, comme départ pour une recherche.

>>> from dateutil import tz
>>> start = datetime(today.year, today.month, today.day, tzinfo=tz.tzutc())
datetime.datetime(2013, 2, 21, 0, 0, tzinfo=tzutc())

Sauf que vous voulez savoir quelle heure il est à New 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'))

Et vous voulez aussi demain comme fin:

>>> from datetime import timedelta
>>> end = start + timedelta(1)
>>> end
datetime.datetime(2013, 2, 21, 19, 0, tzinfo=tzfile('/usr/share/zoneinfo/America/New_York'))

Résumé:

today = datetime.utcnow().date()
start = datetime(today.year, today.month, today.day, tzinfo=tz.tzutc()).astimezone(est)
end = start + timedelta(1)
26
Lennart Regebro

Je voudrais certainement jeter un coup d'œil sur Delorean , pour résoudre votre problème, il faudrait suivre quelques étapes. 

Vous devez d'abord analyser votre chaîne. Excellente utilisation de la méthode Delorean parse

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

Une fois que vous avez la date et l'heure que vous avez analysées dans un objet Delorean, vous convertissez simplement en EST.

>>> d = d.shift('US/Eastern')
>>> d
Delorean(datetime=2013-02-19 22:51:39-05:00, timezone=US/Eastern)

Quoique inutile. Vous ne l'utilisez jamais pour rien dans votre question, mais c'est très facile avec Delorean.

Ensuite, vous obtenez le temps maintenant 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)

Passons maintenant à l'étape truncation

>>> d.truncate('day')
Delorean(datetime=2013-02-21 00:00:00-05:00, timezone=US/Eastern)

faire le simple changement comme ci-dessus en UTC. 

Maintenant, obtenez la fin de la journée. 

d = d.next_day(1) # move to the next day

Puis reculer d'une seconde. Quelque chose dont la bibliothèque a besoin, je vais le mettre à jour. Obtenez simplement la date et l'heure à partir de l'exemple Delorean en le demandant avec l'attribut 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>)

Goodluck, mais cette bibliothèque devrait simplement gérer les opérations datetime :)

6
myusuf3

Voici la solution la plus simple:

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

confirmer:

In [69]: eod_e - sod_e
Out[69]: 86399.99999904633

assez proche pour la plupart des gens

1
Bruce Edge

utiliser datetimepytz résoudra votre problème.

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
1
Lifei Chen

Ce n’est qu’une réponse partielle, car le reste a été bien couvert. J'ai eu du mal avec cela pendant un certain temps, car certaines technologies ont des recherches inclusives, et je ne veux pas inclure de données de la première microseconde du lendemain.

Ma solution pour trouver l'heure de fin de journée rapidement et correctement est la suivante:

reference_time.replace(hour=0, minute=0, second=0, microsecond=0) + timedelta(days=1,microseconds=-1)
0
Braden Heckman