Das Gestern-Problem

  Perl
  Shell
  Dateitransfer
  OS
  Home

  Links

  Impressum

Kennst Du das auch ? Um in einem Script die Logfiles vom Vortag auszuwerten, benötigt man das gestrige Datum. Nur - Wie bekommt man's ?

Zum gestrigen Datum fallen einem doch spontan drei "Algorithmen" ein:

  1. Ein Tool, das das gestrige Datum direkt ausgibt
  2. Ein Tool, das z.B. die Sekunden seit Epoch (1.1.1970, 0:00:00 Uhr) ausgibt, einen Tag (in Sekunden) davon abzieht und diese Sekunden wieder rückwandelt
  3. Eine komplette Kalenderberechnung, der Vollständigkeit halber natürlich unter Berücksichtigung der kompletten Schaltjahresregeln (und für die Erbsenzähler unter uns natürlich nicht zu vergessen: Der Sprung vom Julianischen in den Gregorianischen Kalender).
Schaun' mer mal:
date
Hmm, GNU-date kennt Ausdrücke wie
     ~> date --date 'yesterday'
  
oder auch
     ~> date --date '1 day ago'
  
. Das entspricht dem oben aufgezählten 1. Algorithmus (Tools, die das direkt beherrschen). Plattformunabhängig ist das aber nicht.

Dann gibt's da natürlich noch

    ~> date +%s
  
Das ist der erste Teil vom 2. Algorithmus (Rechnen mit Sekunden seit Epoch). Leider kann selbst GNU-date (geschweige denn das Feld-Wald-und-Wiesen-date der kommerziellen Unix-Hersteller) nicht Sekunden rückwandeln in ein Datum.

Und nicht vergessen: GNU-date ist nicht plattformunabhängig (kann aber natürlich auf vermutlich allen relevanten Plattformen installiert werden)

awk
Ja, auch gawk kann mit Sekunden seit Epoch umgehen. Damit ist der 2. Algorithmus implementierbar.

Mir ist kein "normaler" awk bekannt, der das kann. Schade

Plattformunabhängig ist das daher auch nicht.

Shell + cal
Nun, wir können immer noch den 3. Algorithmus (komplette Kalenderberechnung) umsetzen.

Hier nur kurz die Idee: Wir nehmen cal für die eigentliche Kalenderberechnung (wieviele Tage hat welcher Monat in welchem Jahr) und machen mit etwas einfacher Arithmetik in der Shell den Rest.

perl
Logisch, perl kann den zweiten Algorithmus (Rechnen mit Sekunden seit Epoch) problemlos umsetzen.

Dazu verweisen wir auf unsere Seite Datumsberechnungen in Perl. Dort ist auch ein Modul beschrieben, die unser Problem löst.

tcl, python, ...
(Setze hier deine bevorzugte Sprache ein): Ja, die können das vermutlich alle auch. Aber nicht hier.

War das alles ? Unix wäre nicht Unix, wenn da nicht noch "Guru"-Weg wäre:

Die Umgebungsvariable TZ beschreibt die Zeitzone, in der sich der Anwender zuhause fühlt (nicht zwangsläufig die Zeitzone, in der das System läuft!). Steht das System in Frankfurt und hat dementsprechend TZ=CE(S)T bzw. GMT-1/GMT-2 (je nach Sommerzeit/Winterzeit) gesetzt, kann der Anwender in Greenwich trotzdem durch Setzen von

   ~> export TZ=GMT
   ~> date

sich die Zeit in seiner Zeitzone anzeigen lassen. Dieses kann man nun nutzen:

   ~> TZ=GMT+22 date (in der Sommerzeit)
   ~> TZ=GMT+23 date (in der Winterzeit)

liefert einem das gestrige Datum (ok, die Uhrzeit stimmt nicht, und das Ganze läuft auch nicht zwischen 00:00 und 01:00 Uhr, aber immerhin!).

Ulrich Herbst
Letzte Änderung: 04.12.2003 23:48:44