titel_date_cal.png

Zeitzauber

Kalender auf der Kommandozeile

01.07.2005
Mit den klassischen Tools "cal" und "date" haben Sie Datum und Uhrzeit immer im Blick; auch die Systemzeit ändern Sie mit einem einzigen Kommando in der Shell.

Zu Befehl

Auch wenn sich viele Dinge bequem über grafische Oberflächen wie KDE oder Gnome regeln lassen – wer sein Linux-System richtig ausreizen möchte, kommt um die Kommandozeile nicht herum. Abgesehen davon gibt es auch sonst viele Situationen, in denen es gut ist, sich im Befehlszeilendschungel ein wenig auszukennen.

Es muss nicht immer ein Wandkalender oder ein elektronischer Organizer sein – für einen schnellen Überblick über Datum und Zeit bringt Linux die Kommandozeilen-Tools cal und date mit. Mit cal zaubern Sie ein Kalenderblatt oder eine Jahresübersicht ins Terminal-Fenster, und date gibt nicht nur Datum und Zeit in verschiedenen Formaten aus, sondern passt diese – Administratorrechte vorausgesetzt – auch in Windeseile an.

Ein "cal" für alle Fälle

Das Programm cal gibt einen Kalender auf der Kommandozeile aus. Ohne weitere Parameter zeigt der Aufruf cal den aktuellen Monat hübsch formatiert an. Soll das ganze Jahr auf der Konsole erscheinen, hängen Sie die Option -y an. Um den aktuellen Monat zusammen mit dem vorherigen und dem Folgemonat anzuzeigen, verwenden Sie den Schalter -3 (Abbildung 1).

Abbildung 1: Überblick: "cal -3" zeigt den vorigen, aktuellen und nachfolgenden Monat an.

Einen bestimmten Monat gibt cal aus, wenn Sie diesen mit einer ein- oder zweistelligen Ziffer (also z. B. 6 oder 06) und einer vierstelligen Jahreszahl (z. B. 2005) im Aufruf definieren. So präsentiert cal den Juni 2005, wenn Sie

cal 06 2005

tippen. Da cal bis zum 1. Januar 0001 zurückgeht, reicht es nicht aus, die Jahreszahl zweistellig anzugeben – der Aufruf

cal 06 05

würde den Juni des Jahres 5 n. Chr. ausgeben.

In der Standardanzeige von cal beginnt die Woche unter einigen Linux-Versionen mit einem Sonntag – wer lieber den Montag als ersten Wochentag sieht, hängt den Parameter -m an den cal-Aufruf an.

Das Tool kann noch mehr – mit dem Parameter -j zählt es die Tage von 1 bis 365 (oder in Schaltjahren 366), schaltet also auf julianische Darstellung um:

$ cal -j
         June 2005
 Su  Mo  Tu  We  Th  Fr  Sa
            152 153 154 155
156 157 158 159 160 161 162
…

So erfahren Sie beispielsweise, dass der 9. Juni der 160. Tag des Jahres ist.

Zeitzeugen

Das Programm date bietet nicht nur eine Kalenderfunktion, sondern macht auch Angaben zur Zeit. Ohne weitere Parameter am Shell-Prompt eingegeben, sehen Sie das aktuelle Datum und die Uhrzeit:

$ date
Sun Jun  5 11:13:48 CEST 2005

Erscheint die Ausgabe in englischer Sprache, überprüfen Sie mit dem Kommando echo, welchen Wert die Umgebungsvariable LC_TIME hat, und setzen diese gegebenenfalls auf einen gültigen Wert. (Welche landesspezifischen Einstellungen auf Ihrem System möglich sind, erfahren Sie mit locale -a.)

$ echo $LC_TIME
$ export LC_TIME=de_DE
$ date
So Jun  5 11:14:11 CEST 2005

Da die so gesetzte Variable nur für die aktuelle Bash-Sitzung gilt, machen Sie die Konfiguration dauerhaft, indem Sie den export-Aufruf in die Datei ~/.bashrc eintragen.

Zusammen mit der Umgebungsvariable TZ (englisch "time zone", Zeitzone) zeigen Sie mit date darüber hinaus die aktuelle Zeit und das Datum für andere Länder an. Im Verzeichnis /usr/share/zoneinfo finden Sie sämtliche Zeitzonen der Welt (einige in Unterverzeichnissen). Um z. B. zu erfahren, wie spät es in Neuseeland ist, setzen Sie die Variable TZ temporär und nur für einen einzigen date-Aufruf:

$ TZ=NZ date
Di Jun  7 00:05:09 NZST 2005

Tippfaule, die ständig die Zeit auf der anderen Seite der Welt kontrollieren wollen, schreiben sich diesen Aufruf in einen Alias. Dazu tragen Sie in die Datei ~/.bashrc beispielsweise

alias nz='TZ=NZ date'

ein und lesen die Konfigurationsdatei entweder über

source ~/.bashrc

neu ein oder melden sich neu an. Anschließend reicht der einfache Aufruf nz, um herauszufinden, wie viel Uhr es in Neuseeland ist.

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

Wer hat an der Uhr gedreht?

Als Administrator setzen Sie mit date komfortabel in einem einzigen Aufruf die Systemzeit neu. Dabei können Sie das Datum und die Zeit als eine einzige große Zahl hinter das date-Kommando (ohne vorangestelltes Pluszeichen) setzen. Die Zusammensetzung des Datums und der Zeit ist dabei genau festgeschrieben: Zuerst kommt der Monat (zweistellig), dann der Tag (zweistellig), die Stunde (zweistellig), Minuten (zweistellig) und optional die ersten beiden Stellen der Jahreszahl (z. B. 19), die letzten beiden Stellen der Jahreszahl (z. B. 73) und die Sekunden (zweistellig). Um die Zeit also auf den 09. Juni 1973, 08:13 Uhr zu setzen, werden Sie durch Eingabe von su - zum Administrator und tippen:

# date 060908131973
Sa Jun  9 08:13:00 CEST 1973

Alternativ setzen Sie den Parameter -s und die schon in Abschnitt Heute, heute, nur nicht morgen... beschriebenen Schlüsselwörter und Zahlen ein. Um die Uhr einfach nur zwei Minuten vorzustellen, reicht das Kommando:

date -s '+2 minutes'

Ebenso leicht stellen Sie den Kalender einen Tag zurück:

date -s 'yesterday'

Achten Sie darauf, dass eine Änderung der Systemzeit nicht die CMOS-Uhr beeinflusst. Um diese an die aktuelle Systemzeit anzupassen, tippen Sie (ebenfalls als Administrator root) das Kommando:

hwclock -w

Einige Programme reagieren auf große Zeitsprünge übrigens empfindlich, z. B. das IRC-Programm xchat. Wenn Sie also mit date experimentieren, sollten Sie darauf gefasst sein, dass einige Programme nach einem Neustart verlangen.

Glossar

Umgebungsvariable

Die Shell stellt dem Benutzer einen Speicher bereit, um bestimmte Informationen aufzubewahren und Programmen zugänglich zu machen. Diese Umgebungsvariablen (englisch: environment variables) bestehen jeweils aus dem Namen und dem zugeordneten Wert.

CMOS

Complimentary Metal-Oxide Semiconductor; der Timer-Chip, der die Systemzeit misst, läuft nicht weiter, wenn der Rechner ausgeschaltet ist. Alle PCs haben daher eine Batterie-betriebene Uhr, die das Datum und die Uhrzeit auch dann weiterzählt, wenn der Rechner ohne Stromversorgung ist. Da diese Uhr im gleichen Baustein wie das CMOS-RAM untergebracht ist, nennt man sie auch CMOS-Uhr. Andere gängige Bezeichnungen sind Hardware-Uhr, RTC (Real Time Clock) und BIOS-Uhr.

LinuxCommunity kaufen

Einzelne Ausgabe
 
Abonnements
 

Ähnliche Artikel

Kommentare