mikrocontroller.net

Forum: PC Hard- und Software atime, mtime, ctime - mit Zeitzone? Wenn ja, wie ändern?


Autor: Hansilein (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kurze Frage: Steckt in den Zeitstempeln von Dateien eigentlich die 
Zeitzone mit drin? Wenn ja, wie kann man sie ändern?

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du redest von Linux, nehme ich an?
Da gibt es eine interne Zeit, mit der das OS rechnet.
Traditionell ist das GMT.
An den Dateien klebt für die drei Zeiten jeweils
nur eine Zahl, nämlich die Anzahl Sekunden seit
dem Stichzeitpunkt 1.1.1970 00:00 GMT, also der Wert, den
time() damals jeweils geliefert hat.

Erst bei der Anzeige, z.B. mit ls oder anderen Programmen,
wird daraus etwas anderes.
Mit gmtime() kann man die Anzahl Sekunden in Datum und Zeit
für GMT bzw. UTC wandeln lassen, mit localtime() dagegen
in das gleiche Format, aber unter Berücksichtigung der
aktuellen Zeitzone des Benutzers bzw. des Prozesses und
ggf. der Sommerzeit.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachtrag: nur so kann es übrigens funktionieren, daß
auf ein und demselben Rechner gleichzeitig ein Japaner,
ein Amerikaner und ein Deutscher angemeldet sind und für
eine bestimmte Datei mit ls -l jeweils die Änderungszeit
in ihrem lokalen Zeitsystem angezeigt bekommen.

Autor: Hansilein (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, Linux. Ich frage, weil ich Bilddaten aus einer anderen Zeitzone 
habe, die etwas durcheinandergeraten sind. Ich möchte die Zeitstempel 
auf Ortszeit ändern (der Zeitstempel des Fotos einer Mittags 
fotografierten Uhr soll 1200 sein). Dann kann ich also die lokale 
Anzeige der Zeitzone ignorieren, es würde reichen den Zeitstempel um die 
Differenz der Zeitzonen zu ändern.
Weisst Du zufällig, wie man eine solche relative Änderung durchführen 
kann?

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann geht es wahrscheinlich nicht um ein Unix-artiges Dateisystem,
sondern FAT (Speicherkarte eines Fotos)?
Dann gilt eh nicht, ewas ich ssagte, sondern da kocht jeder sein
Süppchen. Wahrscheinlich wurde einfach vom Foto dessen lokale
Zeit gespeichert.
Dann gibt es keine aber auch drei Zeiten: atime, ctime, mtime...

Autor: Hansilein (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dochdoch, Linux, die Fotos sind jetzt auf einer ext3 Partition..

Autor: Olibert E. (olibert)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du suchst wahrscheinlich hier nach:

man touch

Ansonsten gilt das bereits gesagte, Linux-Maschinen rechnen mit 
Unixtime:

1269292872 -> Mon Mar 22 16:21:12 2010

Autor: Hansilein (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
touch kann anscheinend leider kein offset zur mtime machen, sondern nur 
zur systemzeit.

Mit der shell fällt mir momentan nur ein unixtime auslesen, h*3600 
addieren, zurückschreiben..

Oder 'richtig' programmieren?

mtime [-]yyyymmddhhmmss <file>

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
atime wurde dann aber beim Kopieren dazugelogen, weil es
auf FAT gar nicht gespeichert wird, aber egal.

Eine einfache Variante nur in der Konsole fällt mir spontan auch
nicht ein.
In der Tat kann man das Datum+Zeit mit touch setzen.
Das Problem ist die Rechnerei in der Konsole.
Mit stat könnte man sich den Zeitstempel holen, auch in
der Sekundenform.
Mit sh-Mimik könnte man zu dem Wert etwas addieren oder subtrahieren.
Das Problem wird aber, diesen korrigierten Sekundenwert dann zu
setzen - touch braucht die explizite Angabe von h, min, sec etc..

Wahrscheinlich würde ich mir ein kleines C-Programm, das
für eine Datei aufgerufen wird, schreiben.
Das müsste folgendes tun:
1. Zeit der Datei holen im time-Format mit stat()
2. Aufbrechen der Zeit in Tag, Monat, Jahr, h, min, sec etc. mit
   gmtime()
3. Zu den Sekunden oder Minuten oder Stunden passende Werte
   addieren (darf "blödsinnige" Zeiten geben, z.B. Minuten
   unter 0 oder über 60)
4. zurück konvertieren in die Sek. seit 1970 mit mktime()
   (die "blödsinnigen" Werte werden dabei korrekt verwurstet)
5. Zurückschreiben des Wertes mit utime()

Die Schritte 2...4 könnte man durch einfaches Addieren bzw.
Subtrahieren der Sekunden ersetzen, wenn man das illegale Wissen
hätte, dass es sich bei dem Wert einfach um die Sekunden seit...
handelt :-)

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PS: dieses Programm würde ich der Einfachheit halber nur für
ein Programm stricken, dessen Name aus den Argumenten kommt,
und die Schleife über die Dateien dann in der sh machen, das
spart Arbeit im Programm.

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Um alle Dateien im laufenden Verzeichnis eine Stunde später zu setzen:
for i; do
  touch -d "$(stat -c %y "$i") + 3600 sec" "$i"
done

(GNU touch und GNU date vorausgesetzt.)

EDIT:  Bitte erst an einem Verzeichnis ausprobieren, in dem die 
Zeitstempel kaputt gehen dürfen.  atime (%x) durch %y ersetzt.

Autor: Hansilein (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
habe mir auch gerade was in python gebastelt:

#! /usr/bin/env python

#~ 
http://stackoverflow.com/questions/1158076/impleme...
#~ http://docs.python.org/library/os.html

import sys, os

def touch(fname, times = None):
    with file(fname, 'a'):
        os.utime(fname, times)

if _name_ == "__main__":
    fname, delta = sys.argv[1:]
    statinfo = os.stat(fname)
    times = (int(statinfo.st_atime), int(statinfo.st_mtime) + 
int(delta))
    touch(fname, times)

mizchs vorschlag probier ich jetzt mal..

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Hc Zimmerer:
das geht so aber nur, wenn die resultierende Stunde im Bereich
0...23 bleibt!

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das würde mich aber arg wundern.  Du hast das nicht ausprobiert? 
Also.  Es wäre ein Bug in den fileutils.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wieso Bug?
mit touch -d ... setzt man eine Zeit, und wenn nur eine Zahl
angegeben ist, dann ist das die Stunde.
klaus@a64a:~ > touch -d 23 t.c
klaus@a64a:~ > ls -l t.c
-rw-r----- 1 klaus users 2415 22. Mär 23:00 t.c
klaus@a64a:~ > touch -d 25 t.c
touch: Ungültiges Datumsformat „25“
klaus@a64a:~ > ls -l t.c
-rw-r----- 1 klaus users 2415 22. Mär 23:00 t.c

Autor: Hansilein (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
geht:

#! /bin/sh
for i in all/*; do
  touch -m -d "$(stat -c %y "$i") + 3600 sec" "$i"
done

Autor: Hansilein (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
na, es gibt ja nunmal keine stunde 25..

Autor: Hansilein (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also danke für die hilfe

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oh sorry, ich wusste nicht, daß man bei -d einen Rechenausdruck angeben 
kann.
Falls das so ist, nehme ich alles wieder zurück.
Dann ist das ja wirklich die einfache Lösung!

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du hast nicht verstanden, was das Shellscript macht.  Du solltest im 
Manual nachschlagen was eine Ausdruck mit "Datum + Zeit" macht, denn das 
steht auf der Kommandozeile, wenn Du sie nachvollziehen würdest.  Ein 
solcher Ausdruck ergibt volle Datumsarithmetik.

Nirgends in meinem Shellskript wird '25' stehen.  Bitte erst denken und 
dann maulen.

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah, Du hast es auch so gemerkt.  Gut.  Da hätte ich mir Tipparbeit 
sparen können :).

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schon gut...
Ich hatte gedacht, du rechnest in sh einen neuen Wert für die Stunde aus
und übergibst den an -d...

Autor: Hansilein (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> oh sorry, ich wusste nicht, daß man bei -d einen Rechenausdruck angeben
kann.
Das habe ich in der Doku auch noch nicht gesehen:
http://www.gnu.org/software/coreutils/manual/coreu...

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ah, aber Danke für den Link!

Da sehe ich doch kurz dahinter bei 28.8, daß man mit einem
vorangestellten @ eine absolute Zeit als Sekunden seit 1970
angeben kann!
Das gefällt mir.

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klar, könnte sein.  Auch ich baue manchmal Mist, aber solchen doch eher 
nicht.  Begraben wir's und schön, dass es funktioniert, wie der TE es 
sich gewünscht hat.

Autor: Hansilein (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es steht doch in der Doku:
"Relative items adjust a date (or the current date if none) forward or 
backward. The effects of relative items accumulate."

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.