django: Wie Zeiten richtig anzeigen lassen?

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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')

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Django nutzt keine locales aus naheliegenden Gründen.
TUFKAB – the user formerly known as blackbird
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

OK, aber wie kann es sein, das ich innerhalb einer django App eine andere Uhrzeit bekomme als in einem separaten Python Skript?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Weil das eine mit deiner lokalen Zeit arbeitet und das andere bewusst mit UTC arbeitet.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten