Zeitzauber
Kalender auf der Kommandozeile
Sprichwörtlich
Das Programm date bringt für die Ausgabe ein paar nützliche Formatierungsparameter mit. Zusammen mit einem vorangestellten Pluszeichen (+) sorgen verschiedene Prozentzeichen-Buchstaben-Kombinationen fürs richtige Format:
$ date '+Heute ist der %d. Tag im Monat %B des Jahres %Y.' Heute ist der 07. Tag im Monat Juni des Jahres 2005.
Hier führt %d zu einer zweistelligen Ausgabe des Tages, %B steht für den Monat in Langform und %Y für das Jahr (vierstellig). Eine Übersicht der wichtigsten Format-Platzhalter finden Sie in Tabelle 1.
Der Einsatz dieser Optionen ist immer dann sinnvoll, wenn Sie Teile des aktuellen Datums und der Uhrzeit benötigen. Zusammen mit tar und date erstellen Sie beispielsweise Backups, deren Dateinamen automatisch Tag, Monat und Jahr enthalten:
$ tar cvfj backup_-_$(date +'%d')_$(date +'%m')_$(date +'%y').tar.bz2 *
Tabelle 1: Formatierung der "date"-Ausgabe
| %H | Stunden (00 bis 23)
|
| %I | Stunden (01 bis 12)
|
| %M | Minuten (00 bis 59)
|
| %S | Sekunden (00 bis 60); der Bereich umfasst 60 und nicht 59 Sekunden wegen der Schaltsekunde.
|
| %p | Vor- oder Nachmittag (AM, PM)
|
| %r | Zeitangabe, zwölf Stunden (hh:mm:ss AM/PM)
|
| %R | Zeitangabe, 24 Stunden (hh:mm:ss), entspricht damit %H:%M
|
| %s | Sekunden seit dem 1. Januar 1970 (Unix-Zeit) |
| %Z | Aktuelle Zeitzone (CEST, GMT usw.)
|
| %a | Wochentag in Kurzform (Son, Mon usw.)
|
| %A | Wochentag in Langform (Sonntag, Montag usw.)
|
| %b | Monat in Kurzform (Jan, Feb usw.)
|
| %B | Monat in Langform (Januar, Februar usw.)
|
| %d | Tag in zweistelliger Zahl (01, 31 usw.)
|
| %e | Tag (einstellig mit Leerzeichen, z. B. 7)
|
| %D | Das Datum in der Form mm/dd/yy
|
| %j | Zeigt, der wie vielte Tag im angegebenen Jahr es ist – für den 1. Januar also 1 und in Nicht-Schaltjahren 365 für den 31. Dezember.
|
| %u | Zeigt, der wie vielte Wochentag es ist (1 bis 7).
|
| %U | Zeigt die wie vielte Woche im angegebenen Jahr es ist (00 bis 53).
|
| %y | Jahr, zweistellig (00 bis 99)
|
| %Y | Jahr, vierstellig (z. B. 1973)
|
| %% | Druckt das Prozentzeichen selbst. |
| %n | Zeilenende |
| %t | Tabulator |
Heute, heute, nur nicht morgen…
Die date-Ausgabe können Sie mit der Option -d weiter spezifizieren. Der Parameter versteht als zusätzliche Angabe eine ganze Reihe englischer Schlüsselwörter und Zahlen. Um beispielsweise das Datum von morgen oder gestern auszugeben, setzen Sie die Begriffe tomorrow und yesterday ein:
$ date -d tomorrow Di Jun 7 16:45:15 CEST 2005 $ date -d yesterday So Jun 5 16:46:15 CEST 2005
Weitere Schlüsselwörter sind relative Angaben (next, ago usw.), feste Datumsangaben (09 June 1973, 09 Jun 73 usw.), Wochentage (Monday, Tuesday usw.) und relative Zeitangaben (day, year, week, month, fortnight = 14 Tage usw.), so dass Sie den gestrigen Tag ebenfalls über den Aufruf
date -d '1 day ago'
berechnen können. Setzen Sie wie im Beispiel mehr als ein Schlüsselwort ein, müssen Sie die Datumsangabe in einfache ('') oder normale ("") Hochkommas einschließen. Zusammen mit den Ausgabeformat-Optionen können Sie so beispielsweise den letzten Monat
$ date -d '1 month ago' +'Letzter Monat: %B' Letzter Monat: Mai
oder den Wochentag des dritten Januars ausgeben:
$ date -d 'third January' +%A Montag
Termingeplagte mit Deadlines rechnen darüber hinaus mit einem einzigen Befehl auf der Kommandozeile aus, wie viele Tage bis zur Fertigstellung eines Projektes noch bleiben. Dazu greifen Sie auf die arithmetischen Fähigkeiten der Bash zurück; der zu berechnende Ausdruck steht dabei in doppelten runden Klammern, z. B.
$ echo $((1-1)) 0
Um die Tage bis zur Deadline zu berechnen, stehen in den Klammern zwei date-Ausdrücke: der Tag der Deadline und davon abgezogen das aktuelle Datum:
$ echo $((`date -d '29 July 2005' +%j`-`date +%j`)) 53
Die Formatierung +%j schaltet dabei wieder auf ein "Durchzählen" der Tage eines Jahres um – der 1. Februar ist Tag 32.
Da dieser Aufruf nur funktioniert, wenn beide Tage im selben Jahr liegen, können Sie zu einem kleinen Trick greifen: Dazu ersetzen Sie den Jahrestag (%j) durch die Unix-Zeit (%s) – die zählt die vergangenen Sekunden seit dem 01.01.1970 (0:00 Uhr). Die so berechnete Differenz in Sekunden teilen Sie noch durch 60*60*24 = 86400, um daraus Tage zu erhalten:
$ echo "$((`date -d '09 June 2006' +%s`-`date +%s`)) / 86400" | bc -l 366.45836805555555555555



