Arbeiten mit Digitalen Fotos, Zeitzone und Dateiinformationen

Localtime oder GMtime, das ist hier die Frage und Gedanken zum Upload per HTTP

Eine Reise nach Sydney

Zehn Stunden Unterschied sagt die Zeitzone, was solls. In Sydney angekommen, stellen wir die Uhr an unserer Kamera selbstverständlich auf die dortige Lokalzeit um. Denn wenn wir morgens um 10 Uhr ein Foto von der Oper machen ist es taghell, nach westeuropäischer Zeit hingegen ist es genau Mitternacht, da würde es schon ein wenig merkwürdig erscheinen wenn wir Tagfotos des Nachts schießen würden.

Wieder zuhause angekommen, kopieren wir die Fotos von der Kamera. Was passiert da eigentlich genau bezüglich der Zeitangaben? Nun, die an der Kamera eingestellte Zeit steht per EXIF direkt in der Bilddatei sofern die Kamera EXIF unterstützt. Alle anderen Angaben zur Datei verwaltet das Betriebssystem der Kamera. Diese Angaben sind atime (Access Time), ctime (Change Inode Time) und mtime (Last modified Time). Beim Kopieren der Dateien von der Kamera auf den PC wird nur die mtime übernommen, diese Dateiinformation wird also über die Betriebsysteme hinweg ausgetauscht. Somit haben wir in mtime die Zeit stehen in welcher das Foto gemacht wurde, die Oper in Sydney, Zeitzone GMT+10, vormittags um 10 Uhr aufgenommen.

Achtung Zeitzone

Das Dumme ist jetzt nur, daß an unserem PC eine andere Zeitzone eingestellt ist, bspw. GMT+1 und damit haben wir gegenüber Sydney immer noch 9 Stunden Unterschied. Was aber auch kein Problem ist, denn beim Kopieren der Fotos von der Kamera auf den PC wird die Zeitzone komplett ignoriert und nur der Zeitstring übernommen. So sehen wir in mtime auf dem PC paraktisch dieselbe Uhrzeit wie im Aufnahmedatum welches in EXIF, also in der Bilddatei selbst hinterlegt ist. Über untenstehenden Button können Sie das prüfen:

File-Upload per HTTP

Die File-API moderner Browser liefert beim Anhängen einer Datei deren Last-Modified Date-Time als Anzahl der Millisekunden die seit 1.1.1970 vergangen sind in der Eigenschaft file.lastModified des Dateiobjekts. Diese Zahl sehen Sie oben in der Tabelle. Es liegt nun in der Hand des Programmierers, was er damit macht, also bei einem Upload mitsendet und serverseitig entweder als GMTime oder als LocalTime betrachtet. Beachten Sie: Per native multipart/form-data wird diese Zeitangabe nicht übermittelt.

Generell werden per HTTP grundsätzlich keine Dateiattribute übertragen sondern lediglich der Dateiinhalt im HTTP-Message-Body, weil, wie bereits festgestell, Dateiattribute wie atime und mtime vom Betriebsystem verwaltet werden. Nach einem Uplad auf den Webserver wird die Datei neu angelegt und damit bekommen alle Zeit-Attribute den Zeitstempel des Anlegen der Datei auf dem Server. Es gibt jedoch eine Möglichkeit, mtime und atime nach eigenem Ermessen festzulegen, mit Perl geht das wie folgt:

utime($atime, $mtime, @dateiliste) || die $!;

Doch bevor Sie das tun, betrachten Sie die Arbeitsweise der FileAPI und JavaScript.

JavaScript verstehen

Wenn wir nun ein Foto mit LastModified 01.01.1970 01:00:00 per FileApi an JS übergeben, wird anhand der Datierung ein TimezoneOffset von -60 angenommen, was der Zeitzone +1GMT entspricht. JavaScript betrachtet den Zeitstempel 01.01.1970 01:00:00 als LocalTime für die übergebene Datei (GMT 01.01.1970 00:00:00).

JavaScript betrachtet das Dateiattribut LastModified als LocalTime mit der auf dem PC konfigurierten Zeitzone wobei anhand des übergebenen Datum und Uhrzeit die Sommerzeit (dst) eingerechnet wird.

Die auf dem Webserver eingestellte Zeitzone

ist möglicherweise von der auf Ihrem PC eingestellten Zeitzone abweichend. Somit kann es sein, daß der mit der hochgeladenen Datei mitgelieferte Zeitstempel (Sekunden seit 01.01.1970 00:00:00) eine ganz andere Urzeit und Datumsangabe ergibt, wenn dieser per localtime in ein lesbares Format gebracht werden soll. Denn die am einem hochgeladenen Bild deklarierte Uhrzeit sollte schon mit der Zeit übereinstimmen zu welcher das Foto aufgenommen wurde. Die Lösung beginnt mit dem Design des Uploadformulars und mit einer Überlegung, ob das Aufnahmedatum als Zeitstempel (Anzahl der Sekunden) oder als Literal (dd.mm.yyyy hh:mm:ss) übertragen werden soll. Mit Letzterem sind Sie fein raus, was die Übertragung per Zeitstempel angeht, können Sie es so machen: Addieren Sie bereits im Browser die lokal eingestellte Zeitzone und arbeiten Sie serverseitig nicht mit localtime sondern mit gmtime.


Datenschutzerklärung: Diese Seite dient rein privaten Zwecken. Auf den für diese Domäne installierten Seiten werden grundsätzlich keine personenbezogenen Daten erhoben. Das Loggen der Zugriffe mit Ihrer Remote Adresse erfolgt beim Provider soweit das technisch erforderlich ist. s​os­@rolf­rost.de.