Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Warum wirkt sich die Django-Zeitzoneneinstellung auf die Epochenzeit aus?

Ich bin kein Python- oder Django-Guru, also kann vielleicht jemand besser antworten als ich. Aber ich werde es trotzdem raten.

Sie sagten, dass Sie es in einem Django DateTimeField speichern , die gemäß den Dokumenten, auf die Sie verwiesen haben , speichert es als Python datetime .

Betrachten Sie die Dokumente für datetime , ich denke, der Schlüssel liegt darin, den Unterschied zwischen "naiven" und "bewussten" Werten zu verstehen.

Und als ich weiter recherchierte, stieß ich auf diese hervorragende Referenz . Lesen Sie unbedingt den zweiten Abschnitt „Naive und bewusste Datetime-Objekte“. Das gibt einen kleinen Kontext dafür, wie viel davon von Django kontrolliert wird. Grundsätzlich durch Setzen von USE_TZ = true , bitten Sie Django, aware zu verwenden datetimes statt naiv diejenigen.

Dann habe ich auf Ihre Frage zurückgeschaut. Sie sagten, Sie würden Folgendes tun:

dt = datetime.fromtimestamp(secs)
dt = dt.replace(tzinfo=utc)

Betrachten Sie den fromtimestamp Funktionsdokumentation habe ich diesen Text gefunden:

Ich denke, Sie könnten dies tun:

dt = datetime.fromtimestamp(secs, tz=utc)

Andererseits zeigen die Dokumente direkt unter dieser Funktion utcfromtimestamp Funktion, also sollte es vielleicht sein:

dt = datetime.utcfromtimestamp(secs)

Ich weiß nicht genug über Python, um zu wissen, ob diese gleichwertig sind oder nicht, aber Sie könnten versuchen, zu sehen, ob beides einen Unterschied macht.

Hoffentlich wird eines davon einen Unterschied machen. Wenn nicht, lassen Sie es mich bitte wissen. Ich bin mit Datum/Uhrzeit in JavaScript und in .Net bestens vertraut, aber ich bin immer daran interessiert, wie sich diese Nuancen auf anderen Plattformen wie Python anders auswirken.

Aktualisieren

In Bezug auf den MySQL-Teil der Frage werfen Sie einen Blick auf diese Geige .

CREATE TABLE foo (`date` DATETIME);
INSERT INTO foo (`date`) VALUES (FROM_UNIXTIME(1371131402));

SET TIME_ZONE="+00:00";
select `date`, UNIX_TIMESTAMP(`date`) from foo;

SET TIME_ZONE="+01:00";
select `date`, UNIX_TIMESTAMP(`date`) from foo;

Ergebnisse:

DATE                           UNIX_TIMESTAMP(`DATE`)
June, 13 2013 13:50:02+0000    1371131402
June, 13 2013 13:50:02+0000    1371127802

Es scheint, dass das Verhalten von UNIX_TIMESTAMP Die Funktion wird tatsächlich von MySQL TIME_ZONE beeinflusst Einstellung. Das ist nicht so überraschend, da es in der Dokumentation steht. Überraschend ist, dass die String-Ausgabe von datetime hat unabhängig von der Einstellung denselben UTC-Wert.

Hier ist, was meiner Meinung nach passiert. In den Dokumenten für UNIX_TIMESTAMP Funktion, es heißt:

Beachten Sie, dass es nicht sagt, dass es ein DATETIME sein kann - es heißt, es kann ein DATETIME sein Zeichenfolge . Ich denke also, dass der tatsächliche Wert implizit in eine Zeichenfolge konvertiert wird, bevor er an die Funktion übergeben wird.

Sehen Sie sich jetzt diese aktualisierte Geige an das konvertiert explizit.

SET TIME_ZONE="+00:00";
select `date`, convert(`date`, char), UNIX_TIMESTAMP(convert(`date`, char)) from foo;

SET TIME_ZONE="+01:00";
select `date`, convert(`date`, char), UNIX_TIMESTAMP(convert(`date`, char)) from foo;

Ergebnisse:

DATE                           CONVERT(`DATE`, CHAR)  UNIX_TIMESTAMP(CONVERT(`DATE`, CHAR))
June, 13 2013 13:50:02+0000    2013-06-13 13:50:02    1371131402
June, 13 2013 13:50:02+0000    2013-06-13 13:50:02    1371127802

Sie können sehen, dass bei der Konvertierung in Zeichendaten der Offset entfernt wird. Daher macht es jetzt natürlich Sinn, wenn UNIX_TIMESTAMP diesen Wert als Eingabe nimmt, nimmt es die lokale Zeitzoneneinstellung an und erhält somit einen anderen UTC-Zeitstempel.

Ich bin mir nicht sicher, ob dir das hilft oder nicht. Sie müssen genauer untersuchen, wie Django MySQL sowohl für das Lesen als auch für das Schreiben aufruft. Verwendet es tatsächlich den UNIX_TIMESTAMP Funktion? Oder hast du das nur beim Testen gemacht?