500 Stimmen

Man kann offset-naive und offset-bewusste Zeitpunkte nicht subtrahieren

Ich habe eine zeitzonenbewusste timestamptz Feld in PostgreSQL. Wenn ich Daten aus der Tabelle ziehe, möchte ich die aktuelle Zeit subtrahieren, um das Alter zu ermitteln.

Das Problem, das ich habe, ist, dass beide datetime.datetime.now() y datetime.datetime.utcnow() scheinen Zeitzonen-unkorrekte Zeitstempel zurückzugeben, was dazu führt, dass ich diesen Fehler erhalte:

TypeError: can't subtract offset-naive and offset-aware datetimes 

Gibt es eine Möglichkeit, dies zu vermeiden (vorzugsweise ohne Verwendung eines Moduls eines Drittanbieters).

EDIT: Vielen Dank für die Vorschläge, jedoch versucht, die Zeitzone anzupassen scheint, mir Fehler zu geben.. so ich bin nur gehen, um Zeitzone nicht bewusst Zeitstempel in PG und immer einfügen mit verwenden:

NOW() AT TIME ZONE 'UTC'

Auf diese Weise sind alle meine Zeitstempel standardmäßig UTC (auch wenn es lästiger ist, dies zu tun).

1voto

Nic Gibson Punkte 6866

Gibt es einen dringenden Grund, warum Sie die Altersberechnung nicht in PostgreSQL selbst durchführen können? Etwas wie

select *, age(timeStampField) as timeStampAge from myTable

1voto

I_do_python Punkte 1186

Ich weiß, dass dieser Artikel schon alt ist, aber ich dachte, ich füge meine Lösung hinzu, falls sie jemand für nützlich hält.

Ich wollte die lokale naive Datumszeit mit einer bekannten Datumszeit von einem Zeitserver vergleichen. Im Grunde habe ich ein neues naives datetime-Objekt erstellt, das das bewusste datetime-Objekt verwendet. Es ist ein bisschen ein Hack und sieht nicht sehr hübsch aus, aber die Aufgabe ist erledigt.

import ntplib
import datetime
from datetime import timezone

def utc_to_local(utc_dt):
    return utc_dt.replace(tzinfo=timezone.utc).astimezone(tz=None)    

try:
    ntpt = ntplib.NTPClient()
    response = ntpt.request('pool.ntp.org')
    date = utc_to_local(datetime.datetime.utcfromtimestamp(response.tx_time))
    sysdate = datetime.datetime.now()

...hier kommt das Toffee...

    temp_date = datetime.datetime(int(str(date)[:4]),int(str(date)[5:7]),int(str(date)[8:10]),int(str(date)[11:13]),int(str(date)[14:16]),int(str(date)[17:19]))
    dt_delta = temp_date-sysdate
except Exception:
    print('Something went wrong :-(')

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X