webentwicklung-frage-antwort-db.com.de

Start- und Endzeit des aktuellen Tages bestimmen (UTC -> EST -> UTC); Python

Ich speichere alle meine Zeiten in UTC und mein System ist auf UTC eingestellt (obwohl ich in EST bin).

Ich habe Termine gespeichert als:

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

Ich würde jedoch gerne die heute für EST verfügbaren Informationen auswählen, daher versuche ich:

  • Aktuelle Uhrzeit als UTC abrufen und in EST ändern

    datetime.utcnow().replace(tzinfo=tz.tzutc()).astimezone(tz.gettz('America/New_York'))
    2013-02-19 23:17:20.560898-05:00
    
  • Als nächstes möchte ich die Startzeit für den EST-Tag (2013-02-19 00: 00: 00.000000-05: 00) und die Endzeit (2013-02-19 23: 59: 59.99999-05: 00) erhalten.

  • Sobald ich diese Werte habe, würde ich gerne wieder in UTC konvertieren, so dass ich einen hohen und niedrigen Wert habe, durch den ich festhalten kann, dass mein EST (meine Zeitzone) korrekt ist.

Wenn dies nicht der beste Weg ist, oder ich vermisse etwas (erscheint mir zu kompliziert), bitte helfen Sie mir, das Licht zu sehen!

TIA

Update pro Antwort:

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

Das wird mir geben 

02 20 2013
02 21 2013

Welches ist richtig. Ich muss jetzt die gesamte EST-Zeit daraus generieren und dann in UTC konvertieren. Das kann ich nicht verstehen. Eigentlich möchte ich nach Fertigstellung wahrscheinlich in UTC Epoch-Zeitstempel konvertieren, da dies meine Datenbankoperationen recht einfach macht (<,>, == usw.).

16
mr-sk

Der erste Schritt, die aktuelle Uhrzeit als UTC abzurufen und in EST umzuwandeln, erscheint etwas sinnlos. Benutzt du diese Zeit für irgendetwas?

Abgesehen davon scheint es eher geradlinig. Sie möchten den Beginn und das Ende eines EST-Tages in UTC abrufen. Erstellen Sie sie und konvertieren Sie sie in UTC. Das ist nicht so kompliziert. :-)

Vielleicht möchten Sie jedoch Ihre Übereinstimmungsroutinen betrachten, damit Sie den Beginn von heute als niedrigeren Wert und den Beginn von morgen als höheren Wert verwenden können, sodass Sie sich nicht mit dieser Zeit von 23: 59: 59,9999 befassen müssen .

Update:

Nach meinem ursprünglichen Verständnis Ihrer Frage möchten Sie Folgendes tun:

Zuerst möchten Sie das aktuelle Datum in UTC abrufen (also um 11 Uhr EST am 12., um den 22., da es der 22. in UTC ist).

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

Zweitens möchten Sie 00:00:00 des Tages in UTC als Start für eine Suche.

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

Nur möchten Sie wissen, wie spät es in New York ist:

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

Und du willst auch morgen als Ende:

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

Zusammenfassung:

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

Ich würde definitiv Delorean einen Blick geben, um Ihr Problem zu lösen, würde ein paar Schritte folgen. 

Sie müssen zuerst Ihre Zeichenfolge analysieren. Hervorragende Verwendung der Delorean Analyse Methode. 

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

Sobald Sie die Datumszeit haben, die Sie in einem Delorean-Objekt analysiert haben, konvertieren Sie sie einfach in EST

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

Wenn auch sinnlos. Sie verwenden es nie für irgendetwas in Ihrer Frage, aber bei Delorean ganz einfach.

Dann bekommst du jetzt die Zeit in EST

von delorean importieren delorean

>>> d1 = Delorean(timezone="US/Eastern")
>>> d1
Delorean(datetime=2013-02-21 00:35:56.405256-05:00, timezone=US/Eastern)

Nun zum Abschneiden Schritt. 

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

machen Sie die einfache Umstellung wie oben zu UTC. 

Holen Sie sich jetzt das Ende des Tages. 

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

Dann um eine Sekunde zurückzuschalten. Etwas, das die Bibliothek benötigt, werde ich dies aktualisieren. Holen Sie die datetime einfach aus dem Delorean-Beispiel, indem Sie sie mit dem datetime-Attribut danach fragen.

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, aber diese Bibliothek sollte einfach mit datetime-Vorgängen umgehen :)

6
myusuf3

Die Frage ist alt, aber vielleicht hilft das:

import datetime
end_of_today = datetime.datetime.combine(datetime.datetime.today(), datetime.time(23, 59, 59, 999999))
2
juankysmith

Ich bin nur darauf gestoßen, hier ist die einfachste Option, die ich gefunden habe:

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

bestätigen:

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

nah genug für die meisten Menschen

1
Bruce Edge

verwenden Sie datetimepytz, um Ihr Problem zu lösen.

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

Dies ist nur eine teilweise Antwort, da der Rest gut abgedeckt wurde. Ich hatte einige Zeit damit zu kämpfen, da einige Technologien Suchanfragen enthalten, und ich möchte keine Daten aus der ersten Mikrosekunde des nächsten Tages einbeziehen.

Meine Lösung für das schnelle und korrekte Finden des Tagesabschlusses lautet:

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