Differenz zw. zwei Zeitstempel in 64bit float

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Python91
User
Beiträge: 2
Registriert: Sonntag 19. November 2017, 18:17

Hallo liebes Forum,

Ich bräuchte kurz Hilfe für die Realisierung einer Funktion.
Szenario:
Ich habe zwei genaue Zeitpunkte
Datum1 mit Uhrzeit1
Datum2 mit Uhrzeit2
(es ist keine Datetime sondern ein Datum und eine Uhrzeit getrennt)

Nun möchte ich die Differenz der beiden Zeitstempel ausrechnen und zwar in Sekunden. Ich weiß dass man dazu den Unix Zeitstempel verwenden kann, jedoch ist dieser in 32bit Integer und hat daher das "Jahr 2038"-Problem. Ich möchte daher die Funktion so schreiben, dass 64 bit Floats verwendet werden, was angeblich mit time.time() funktioniert. Davor brauche ich aber eine Funktion die ein Datum und eine Uhrzeit nimmt und diese in ein 64bit Float umwandelt damit ich dann die Differenz der beiden Zeitstempel ausrechnen kann.
Ich habe schon recherchiert und viele Funktionen gefunden, jedoch habe ich immer Bedenken dass es eine 32Bit Integer Realisierung ist. Daher die Frage: Gibt es eine Funktion in Python der man ein Datum und eine Uhrzeit getrennt übergeben kann, die dann daraus ein 64bit Float errechnet (ähnlich zum Unix Standard)? Alternativ kann man ja aus der Uhrzeit und dem Datum erstmal ein Datetime erstellen und dann einer Funktion übergeben die daraus dann den 64bit Float errechnet.
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Gibt es einen Grund warum du nicht das datetime Modul und seinen Typ timedelta benutzt? Damit sollten diese Probleme nicht auftreten.
Python91
User
Beiträge: 2
Registriert: Sonntag 19. November 2017, 18:17

Das mit dem Timedelta habe ich völlig übersehen. Danke für den Tipp. Ich mache das jetzt so:

Code: Alles auswählen

now = datetime.now()
zeitstempel = datetime(2040,11,19,19,36,0)
diff = zeitstempel-now
print(now)
print(zeitstempel)
print(diff.total_seconds())

Ausgabe:
2017-11-19 19:41:45.920148
2040-11-19 19:36:00
725846054.08

Er scheint auch keine Probleme mit einem Datum über 2038 zu haben. Die Frage ist nur: Ist datetime.now() automatisch Zeitzonen behaftet? Ich verwende den Code nämlich in Django (Web Framework). Soweit ich das verstanden hab ist datetime.now() ohne Zeitzonen und datetime.utcnow() mit Zeitzonen richtig?
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nein. AFAIK musst du noch das Paket tzinfo installieren. Nur dann bekommst du Zeitzonen. UTC berücksichtigt nur EINE Zeitzone - deine. So das UTC korrekt ist. Aber damit kannst du nicht verschiedene individuelle Zeitzonen verrechnen. Jedenfalls nicht schlüssig. Wobei das eh ein ganzer Sack voll Probleme ist, den man nicht so schnell durchsteigt (und en Detail auch vergisst, so wie ich ;) )
Benutzeravatar
noisefloor
User
Beiträge: 3854
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
UTC berücksichtigt nur EINE Zeitzone - deine
Nee, anders rum: "UTC" steht für "Universal Time Coordinated" (auf Deutsch: koordinierte Weltzeit) und ist das, was früher als "Greenwich Mean Time" bekannt war.

Also `datetime.datetime.now()` liefert per default die lokale Zeit, `datetime.datetime.utcnow()` die koordinierte / universelle Zeit.

Wie Django mit Zeitzonen umgeht kann man konfigurieren: https://docs.djangoproject.com/en/1.11/ ... timezones/ (Hinweis: Django 1.8 LTS benötigt dazu die manuelle Installation des `pytz` Moduls, bei 1.11 LTS wird es automatisch installiert).

Gruß, noisefloor
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

@noisefloor: das ist mir schon klar. Aber natürlich muss es dafür die Zeitzone kennen, in der du dich befindest:

Code: Alles auswählen

>>> dt.datetime.now()
datetime.datetime(2017, 11, 19, 20, 40, 31, 317404)
>>> dt.datetime.utcnow()
datetime.datetime(2017, 11, 19, 19, 40, 48, 477620)
Sonst kann die CET Differenz ja nicht bestimmt werden. Und das habe ich gemeint.
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und noch ein Nachtrag: utcnow und now ohne tzinfo erlauben keinen verlässlichen Vergleich: wenn ich in genau einer Stunde einen UTC timestamp nehme, vergleicht der mit now True.

Richtig wäre aber natürlich die 1 Stunde Differenz.

Wenn man das also richtig machen will, muss man mit tzinfo arbeiten. Wie sich das mit Django verhält weiß ich nicht, das nutze ich nicht.
Benutzeravatar
noisefloor
User
Beiträge: 3854
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Und das habe ich gemeint.
Axo - hatte ich anders verstanden.
Wie sich das mit Django verhält weiß ich nicht, das nutze ich nicht.
Django nutzt `pytz` und ist "timezone aware". In der `settings.py` gibt man auch die Zeitzone an, in der man sich befindet bzw. von der Django aussehen soll. Konkret genutzt habe ich das aber auch nicht, weil es für meine Apps "reicht", wenn die Zeitstempel mit der aktuellen lokalen Zeit geschrieben werden. Habe keine Nutzer in anderen Zeitzonen :-)

Gruß, noisefloor
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und noch ein Nachtrag: ich sehe erst jetzt, das du schon pytz erwähnt hast. Das meinte ich wenn ich hier immer vom tzinfo Modul sprach... wie gesagt: sperriges Thema mit viel Vergesslichkeit behaftet ;)
Antworten