Seite 1 von 1

django: Wie Zeiten richtig anzeigen lassen?

Verfasst: Donnerstag 14. Februar 2008, 10:38
von jens
Ich möchte ein Dateidatum (stat.ST_MTIME) in django richtig anzeigen lassen, aber wie?

In ./contrib/admin/templates/admin/ibject_hostory.html hab ich sowas gefunden:

Code: Alles auswählen

{{ action.action_time|date:_("DATE_WITH_TIME_FULL") }}
Das sieht für mich ein wenig merkwürdig aus. Ich gehe mal von aus, das der String DATE_WITH_TIME_FULL über die Übersetzung zu einem richtigen Format gewandelt wird.
Dokumentiert ist sowas aber nicht wirklich, oder???
Hier steht zumindest nicht viel dazu: http://www.djangoproject.com/documentat ... ates/#date

Verfasst: Donnerstag 14. Februar 2008, 11:47
von jens
Also hab mal nachgesehen: _("DATE_WITH_TIME_FULL") ist "j. N Y, H:i" Diese dumme PHP Syntax: http://www.djangoproject.com/documentat ... lates/#now
Also das übernehme ich dann erstmal so.

Nun hab ich allerdings ein anderes Problem: Die Zeiten stimmen nicht :(

Deswegen hab ich mal ein kleines lokales Test Skript geschrieben:

Code: Alles auswählen

import os, stat
from datetime import datetime

path = "."
for fn in sorted(os.listdir(path)):
    abs_fn = os.path.join(path, fn)
    print fn
    mtime = os.stat(abs_fn).st_mtime
    print datetime.fromtimestamp(mtime)

    print
Das Skript spuckt mir die richtige Uhrzeit aus.

Wenn ich aber datetime.fromtimestamp(mtime) in meiner django App anzeigen lassen, sind das andere Zeiten, warum?

Mal die locales checken:

Code: Alles auswählen

        print locale.getdefaultlocale()
        print locale.getlocale(locale.LC_ALL)
        locale.setlocale(locale.LC_ALL, '')
        print locale.getlocale(locale.LC_ALL)
Liefert mir bei meinem lokalen Test Skript (mit den richtigen Zeiten), das:
('de_DE', 'UTF8')
(None, None)
('de_DE', 'UTF8')
In der django App sieht das so aus:
('de_DE', 'UTF8')
('de_DE', 'UTF8')
('de_DE', 'UTF8')

Verfasst: Donnerstag 14. Februar 2008, 14:40
von mitsuhiko
Django nutzt keine locales aus naheliegenden Gründen.

Verfasst: Donnerstag 14. Februar 2008, 14:55
von jens
OK, aber wie kann es sein, das ich innerhalb einer django App eine andere Uhrzeit bekomme als in einem separaten Python Skript?

Verfasst: Donnerstag 14. Februar 2008, 16:54
von Leonidas
Weil das eine mit deiner lokalen Zeit arbeitet und das andere bewusst mit UTC arbeitet.

Verfasst: Donnerstag 14. Februar 2008, 17:09
von jens
Das ist doch mal eine Erklärung ;)

OK, aber wie bekomme ich die UTC wieder zurück zur lokalen Zeit?

Ich näher mich dem hiermit an:

Code: Alles auswählen

            mtime = statinfo.st_mtime
            localtime = time.gmtime(mtime)
            localdatetime = datetime(*localtime[:6])
Aber so ganz stimmt das noch nicht.
Nautilus und "ls -la" zeigt mir z.B. 09:27 an. Django macht daraus dann 08:27.

Ich will ja nicht das es irgendwie in der Zeitzone verschoben wird oder so. Es soll das wiederspiegeln, was das Dateisystem gespeichert hat.

EDIT: Wobei, wie wird das allgemein gehandhabt? Wie verhält sich ein FTp Server? Also wenn ich einen Upload einer Datei mache, die lokal um 10Uhr erstellt wurde. Der Upload passiert auf einen Server, der in einer anderen Zeitzone steht... Was wird also als Dateidatum gespeichert? Gibt es da eine allgemeinen Leitfaden oder sowas?

EDIT2: Hm... Es scheint hier ein komplexeres Problem vorzuliegen... Hab ich im Netz aufgeschappt:
Windows speichert als Dateidatum die lokale Zeit. Unix speichert immer Greenwich-Zeit und errechnet mit der derzeit angegebenen Zeitzone dann die lokale Zeitangabe.

Verfasst: Donnerstag 14. Februar 2008, 17:41
von Leonidas
Insgesamt ist es am schlauesten Dinge generell in UTC zu speichern. Und das schreibe ich nicht nur deswegen, weil Unix das so macht.

Und zwar: wenn du eine Uhrzeit in UTC speicherst, kann sich jeder die Zeit ausrechnen die bei ihm war, als die Datei angelegt wurde. Mit irgendeiner anderen Zeitzone müsstest du noch die Zeitzoneninfos, also die Abweichung von der UTC mitgeben, was natürlich überflüssig ist, da man gleich in UTC rechnen kann.

Ein Beispiel: ich bin in Sofia, du in Köln. Bei mir ist UTC+2, bei dir UTC+1 (jetzt mal Sommer/Winterzeit außer acht lassend). Jetzt erstelle ich um 13:00 eine Datei. Wenn ich es dumm handhaben wollte, dann würde ich 13:00 als Dateidatum angeben. Wenn ich dir fünf Minuten später diese Datei schicke, ist es bei dir 12:05, und du bekommst eine Datei aus der Zukunft. Speichere ich aber in UTC, dann hat die Datei die Uhrzeit 11:00 (an jedem Ort der Welt ist um 11:00 UTC auch wirklich 11:00 UTC, also ist es nirgendwo früher oder später wie mit den Zeitzonen). Diese Datei schicke ich dir, der du UTC+1 bist, bei dir wird eine Stunde draufgerechnet und du hast eine Datei die 12:00 angelegt wurde, also zur gleichen Zeit wie bei mir 13:00 war. Das heißt: die Zahlen in der Uhrzeit stimmen nicht, aber der Zeitpunkt ist der gleiche gewesen. Und darum geht es.