time.strftime("%x", os.stat(__file__)[ST_MTIME])

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
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Freitag 11. November 2005, 20:45

Bin gerade etwas verlegen:

Code: Alles auswählen

import os, time

from stat import ST_MTIME
mtime = os.stat(__file__)[ST_MTIME]
print mtime

print time.strftime("%x", mtime)
Ausgabe:
Traceback (most recent call last):
File "test.py", line 8, in ?
print time.strftime("%x", mtime)
TypeError: argument must be 9-item sequence, not int
Muß ich da irgendwas mit stat_float_times() machen???

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Freitag 11. November 2005, 21:00

Ah, so geht's:

Code: Alles auswählen

import os, time

mtime = os.stat(__file__).st_mtime
print time.strftime("%x", time.localtime(mtime))
st_mtime sind einfach nur die sec als int... strftime erwartet aber ein struct_time Objekt...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Donnerstag 17. November 2005, 11:56

Ich komme gerade mal wieder nicht weiter:

Code: Alles auswählen

import os, time

mtime = os.stat(__file__).st_mtime
print "mtime:", mtime

gmtime = time.gmtime(mtime)
print "gmtime:", gmtime
time_str = time.strftime("%d %b %Y %H:%M:%S +0000", gmtime)
print "time_str:", time_str
strptime = time.strptime(time_str, "%d %b %Y %H:%M:%S +0000")
print "strptime:", strptime

print "mktime:", time.mktime(strptime)
Ausgabe:
mtime: 1132224934
gmtime: (2005, 11, 17, 10, 55, 34, 3, 321, 0)
time_str: 17 Nov 2005 10:55:34 +0000
strptime: (2005, 11, 17, 10, 55, 34, 3, 321, -1)
mktime: 1132221334.0
Also ich möchte einen den mtime in einen lesbaren String packen und dieses auch wieder zurück wandeln können...
Wie man sieht klappt das so nicht, weil anscheinen die Zeitzone bei strptime "verrutscht"... Wie geht's richtig???

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Donnerstag 17. November 2005, 12:28

Ok, das geht:

Code: Alles auswählen

mtime = os.stat(__file__).st_mtime
print "mtime...:", mtime

time_format = '%X %x ' + str(time.timezone)

time_str = time.strftime(time_format, time.localtime(mtime))
print "time_str:", time_str

strptime = time.strptime(time_str, time_format)
print "strptime:", strptime

mktime = int(time.mktime(strptime))
print "mktime..:", mktime
Ausgabe:
mtime...: 1132226821
time_str: 12:27:01 11/17/05 -3600
strptime: (2005, 11, 17, 12, 27, 1, 3, 321, -1)
mktime..: 1132226821
Aber das ist eigentlich eine schlechte Lösung! Zwar ist es schön, das der time_str die localtime ist, aber das ganze klappt nur dann, wenn man in der selben Zeitzone ist :(

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Donnerstag 17. November 2005, 12:38

Also nochmal genau was ich eigentlich will:
Ich möchte ein os.stat().st_mtime timestamp in einer Lesbarer Form in einer Textdatei abspeichern, am besten in der lokalen-Zeitzone. Später beim lesen möchte ich aber auch wieder genau den timestamp rekonstruieren können, um es mit st_mtime wieder vergleichen zu können.

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Donnerstag 17. November 2005, 14:14

Ich würde erstmal nicht %x verwenden, da das locale-abhängig ist. Dann würde ich folgendes machen:

Code: Alles auswählen

mtime = os.stat(__file__).st_mtime
print "mtime...:", mtime

time_format = '%Y-%m-%d %X'

time_str = time.strftime(time_format, time.gmtime(mtime))
print "time_str:", time_str

strptime = time.strptime(time_str, time_format)
print "strptime:", strptime

mktime = int(time.mktime(strptime)-time.timezone)
print "mktime..:", mktime
Also immer in UTC abspeichern und nacher an die Timezone anpassen.
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Donnerstag 17. November 2005, 14:25

OK, du hast zum schluß den time.timezone eingerechnet...
Ich möchte es ja für die md5sum-Datei verwenden. Hat nun jemand in einer anderen Zeitzone die md5-Summe erstellt und ich will sie hier vergleichen, stimmen die Uhrzeiten nicht überein. (Ist in dem Falle kein Beinbruch, aber doof)

Ich müßte also eigentlich den time.timezone-Wert mit abspeichern und später wieder einlesen und dann einrechnen...

Aber gibt es dafür nicht schon was fertiges???

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Donnerstag 17. November 2005, 22:36

gelöscht

Erst lesen, dann denken, dass posten
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Freitag 18. November 2005, 08:38

Joghurt hat geschrieben:gelöscht
Wie du hast die richtige Lösung gelöscht :P

@all: Hab ich hier ein Problemfall über den sich bisher keiner Gedanken gemacht hat? Oder gibt es keine vorgefertigte Lösung?

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Freitag 18. November 2005, 16:08

Wenn du dir über so etwas Gedanken machen willst... (Ich gehe in der Regel davon aus, dass wenn jemand in Amerika zeitgleich mit mir eine Datei ändert, dass diese Änderungen nicht identisch sind)

Dann lass doch das umrechnen in Lokalzeit (-timezone) einfach weg und vergleiche nur noch in UTC.

Also: Mtime(Datei1)+timezone == stored mtime => zeitgleich
(Beachte, hier natürlich plus, da du in UTC rechnen willst)
Antworten