2016-04-08 8 views
2

Dies funktioniert nicht:Python zu bestimmen, ob ein Zeitstempel unter Sommerzeit ist

t = os.path.getmtime(filename) 
dTime = datetime.datetime.fromtimestamp(t) 
justTime = dTime.timetuple() 
if justTime.tm_isdst == 0 : 
    tDelta = datetime.timedelta(hours=0) 
else: 
    tDelta = datetime.timedelta(hours=1) 

Was stattdessen passiert, ist, dass die bedingten 1 immer gleich, obwohl einige der Zeitstempel innerhalb Tageszeit auf Sommerzeit zu sein.

Ich versuche, einen Python-Aufruf das Verhalten eines c-basierten Anrufs übereinstimmen.

+0

Dateisysteme speichern den Datums-/Zeitstempel als die Anzahl der Sekunden seit der Epoche, die keine Zeitzone oder DST-Informationen enthält. Dies wird nur hinzugefügt, wenn Sie die Epoche in ein darstellbares Format umwandeln. Welchen c-basierten Anruf versuchen Sie zu erreichen? – cdarke

+0

Wenn ich denke, ich muss (nur) eine Zeitzone definieren und pytz bitten, sie zu lokalisieren, was DST erlaubt. – Jiminion

+0

Sie sollten nur Ihre aktuelle Zeitzone verwenden und keine hinzufügen. Die Sommerzeit wird nicht zum gleichen Zeitpunkt über Zeitzonen hinweg angewendet. – cdarke

Antwort

3

Um herauszufinden, ob eine bestimmte Zeitstempel Saving Time (DST) in der lokalen Zeitzone Tageslicht entspricht:

import os 
import time 

timestamp = os.path.getmtime(filename) 
isdst = time.localtime(timestamp).tm_isdst > 0 

It may fail. Um die Probleme zu umgehen, könnten Sie einen tragbaren Zugriff auf die tz-Datenbank mit pytz Modul erhalten:

from datetime import datetime 
import tzlocal # $ pip install tzlocal 

local_timezone = tzlocal.get_localzone() # get pytz tzinfo 
isdst = bool(datetime.fromtimestamp(timestamp, local_timezone).dst()) 

Verwandte: Use Python to find out if a timezone currently in daylight savings time.

+0

Das hat funktioniert. Vielen Dank. – Jiminion

0

Warum gehen Sie davon aus, dass Ihr Dateisystem Zeitstempel mit einer Zeitzone schreibt?

Auf einem Server bleiben Sie bei UTC, das keine Sommerzeit hat. Auf einem Desktop sollten Sie den letzten Moment der Sommerzeitänderung (ein oder aus) nachschlagen und die Uhrzeit entsprechend korrigieren. Ich weiß nicht, ob pytz diese Informationen enthält, aber diese Informationen sind definitiv im Internet in einer maschinenlesbaren Form verfügbar.

Beachten Sie, dass für einige Momente während der Übergang von DST einige Werte der lokalen Zeit zweimal auftreten, und es ist unmöglich zu sagen, ob eine bestimmte Zeitstempel (zB 02.30) aufgetreten vor oder nach dem Wechsel (innerhalb eine Stunde).

+0

Ich versuche, das Verhalten eines c-basierten Anrufs anzupassen. – Jiminion

+0

@Jiminion: welcher c-basierte Anruf? – cdarke

+0

'getmtime()' gibt "Sekunden seit Epoche" zurück, die nicht in einer Zeitzone ist (es ist nicht in UTC, es ist nicht in der lokalen Zeitzone). Es ist die gleiche Nummer auf der ganzen Welt (es spielt keine Rolle, welche Zeitzone der Server verwendet, solange seine Zeit mit einer gewünschten Uhr synchronisiert ist). Siehe [Gibt Pythons 'time.time()' den lokalen oder UTC-Zeitstempel zurück?] (Http://stackoverflow.com/a/20035913/4279) – jfs

Verwandte Themen