python - datetime-mit timezone zur Epoche
In dem code unten, bin ich die Berechnung jetzt Epoche und zu Beginn der heutigen Epoche.
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')
print-Anweisungen:
2012-08-28 13:52:21.595718-05:00
1346187141
2012-08-28 00:00:00.595718-05:00
1346137200
Konvertieren Epochen-Zeitstempel mit CDT-timezone:
1346187141 - Aug 28 2012 15:52:21,
1346137200 - Aug 28 2012 02:00:00
Ich würde gerne die zweite Epoche zu Beginn des Tages, aber es ist 2 Uhr morgens. Wie es aussieht ist es immer noch mit der lokalen Zeitzone PST-Datei bei der Konvertierung in die Epoche.
Was mache ich falsch ? oder geht das anders?
Dank!
Du musst angemeldet sein, um einen Kommentar abzugeben.
HINWEIS: Meine Antwort ist flat-out falsch. (Ich möchte um es zu löschen, bin aber nicht in der Lage zu tun, bis das accept flag entfernt wird.)
Finden Sie J. F. Sebastian ' s Antwort.
Hier ist der code demonstriert einen Wert von
now_tz
für die unsere zwei Methoden unterschiedliche Ergebnisse erzeugen.(Original Antwort abgefaßten)
America/Chicago
stattCST6CST
. Nur eine Handvoll von POSIX-Zeit-Zonen sind in der tzdb, und Sie sind nur da, um die Abwärtskompatibilität zu unterstützen.now_tz.replace(hour=0,...)
zurückgeben kann denormalisiert datetime-Objekt aus, wenn die Mitternacht hat unterschiedliche utc-offset von now_tz in tz1 Zeitzone.tz1.normalize()
nennen könnte notwendig sein, so dass tzinfo würde entsprechend die richtige Zeitzone. Das Ergebnis ist undefiniert, wenn es eine Zeitumstellung um Mitternacht (Brasilien).tz.localize(is_dst=None)
löst eine Ausnahme in diesem Fall anstelle von lautlos Rückkehr eine falsche Antwort (obwohl es angebracht sein könnte, zu unterdrücken manchmal Ausnahmen)..replace()
2. Mitternacht (Ortszeit) mehrdeutig sein kann oder sogar nicht existent (z.B. wegen Sommerzeit):pytz.timezone('Brazil/East').localize(datetime(2014, 10, 19), is_dst=None)
replace
ist eine gute Sache, auch wenn es nicht die endgültige Antwort. (2) Während der Lokalisierung zu einer Zeitzone, die beobachtet DST erzeugen kann, nicht eindeutig oder nicht vorhandene Daten, es gibt nie eine Schwierigkeit lokalisieren UTC, da es nicht beobachten DST. Soutc.localize
ist immer sicher, und daheris_dst=None
ist nicht erforderlich in den code oben.begin_day
im das Beispiel ist in einem inkonsistenten Status: break-down-Zeit entspricht nicht tzname, utcoffset (falsch tzinfo). Ich weiß nicht, welche Laune der Umsetzung machtutctimetuple()
Werte gleich, während utcoffset() sind verschiedene für die Vereinten Nationen und der normalisierten Datumsangaben. (2) UTC ist ein besonderer Fall (gleichen utc-offset, immer). Sie brauchen nichtlocalize()
in diesem Fall könnten Sietzinfo
parameter direkt z.B.datetime(1970, 1, 1, tzinfo=pytz.utc)
.begin_day == begin_day2
Wahr ist..normalize()
call ("standard" - Darstellung) macht deutlich, dassbegin_day
ist nicht Mitternacht. Mitternacht (Ortszeit US/Eastern) auf2002-10-27
ist ein anderes moment in der Zeit, (midnight = tz.localize(datetime(2002, 10, 27), is_dst=None)
), d.h., Ihre Antwort produzieren können falsch führen.begin_day.hour != 0
(nicht Mitternacht) manchmal, D. H.,normalize()
macht das Problem aber nicht beheben. Meine Antwort zeigt eine Möglichkeit, um das Problem zu vermeiden.Konvertieren zu einer Zeit mit Zeitzone Epoche (POSIX-timestamp):
Es ist wie
datetime.timestamp
Methode implementiert ist, für timezone-bewusstdatetime
Objekte in Python 3.Bekommen "jetzt-Epoche":
Oder (vorausgesetzt
time
verwendet POSIX epoch):Erste "zu Beginn der heutigen Epoche" ist komplexer, denn die aktuellen Tag kann unterschiedlich sein in verschiedenen Zeitzonen:
Sehen Wie bekomme ich die UTC-Zeit von "midnight" für eine bestimmte Zeitzone?.
Bekommen "Anfang der heutigen Epoche" vorausgesetzt, UTC Datum:
Sehen Die Konvertierung von datetime.date/datetime.datetime in UTC-Zeitstempel in Python.
die neueste Version von einfache-Datum (version 0.2 auf pypi) verwalten die details für Sie:
können wir rückwärts gehen, um zu überprüfen, die Zeitstempel (obwohl es klar vor, dass der Wechsel der Zeitzone nicht ändern, die Epoche, während der Bewegung zu Beginn des Tages haben):
.replace()
- Aufruf fehlschlägt (unendliche Rekursion) z.B.SimpleDate('2014-08-20 03:29:35.203607 UTC').replace(hour=0, minute=0, second=0, microsecond=0)
(simple-Datum==0.4.8).