Den Navigationsbereich überspringen...

Navigation

Spoiler

2009/10/31: Man kann date(1) bzw. die Wochennummerierung nach ISO 8601 (doch) für eindeutige, wöchentliche Backups verwenden. Man muss es nur richtig machen.
Siehe "Update".

Vorwort

Leider kann man date(1) nicht verwenden, wenn man (wöchentliche) Backups nach der Wochennummer im Jahr benennen will. Unpraktischerweise ist - meiner Meinung nach - der Standard zur Nummerierung der Wochen und nicht date (bzw. strftime, siehe Exkurs) an dem Problem schuld.

Auf die Problematik mit date und wöchentlichen Backups bin ich Anfang Januar 2004 wieder einmal gestoßen - weil ich date dazu verwendet habe, die Dateinamen für meine Backups zusammenzusetzen. Die Datei backup.2004w11.tar sollte zum Beispiel das Wochenbackup der 11ten Woche im Jahr 2004 enthalten. date (bzw. ISO 8601, auch im Exkurs) ist dafür allerdings leider prinzipiell ungeeignet.

Begründung

Bei der Verwendung von date kommt es (mit %V) zu "doppelten" Wochen oder (mit %W) zu nicht standardkonformen Wochennummerierungen. Man hat also die Wahl zwischen standardkonformen - und deswegen unbrauchbarem Verhalten und Verhalten gegen die übliche Durchnummerierung der Wochen im Jahr - was auch Nachteile mit sich bringt.

date mit der Formatangabe "+%V"

Aus man date:

%V     week  number  of  year  with Monday as first day of
       week (01..53)

Das Kommando date "+%V" gibt für den 1.1.2003 "01", also "Woche Nummer 1 (im Jahr 2003)" aus. An sich wäre das ja ok - allerdings scheint mit dieser Option auch der 31.12.2003 innerhalb der ersten Woche (des Jahres 2003) zu sein:

bash$ date -d "2003/01/01" +%V
01
bash$ date -d "2003/12/31" +%V
01

Mit %V gibt es (nur als ein Beispiel) die erste Woche im Jahr 2003 also zweimal. Einmal am Anfang des Jahres und einmal am Ende des Jahres. Dieses Verhalten ist nach ISO 8601 korrekt. Für Backup-Zwecke ist es allerdings etwas "ungeschickt", wenn es eine Woche zweimal gibt.

Der 1.1.2005 ist mit date "+%V" noch Woche 53 (des Jahres 2004), was mit meinem Kalender auf Papier (und ISO 8601) übereinstimmt. Man könnte also prinzipiell im Kalender nachschlagen, daß der 1. Januar 2005 im Backup mit dem Namen backup.2005w53.tar enthalten ist. Wie naheliegend - mal von dem Problem der "doppelten" Wochen abgesehen...

date mit der Formatangabe "+%W"

Aus man date:

%W     week number of year with Monday  as  first  day  of
       week (00..53)

Das Kommando date "+%W" gibt für den 1.1.2004 "00", also "Woche 00", aus. Damit gibt es also wohl keine "doppelten" Wochen, ist nach ISO 8601 allerdings wieder falsch. Wenn man also das Backup zu einem bestimmten Tag sucht, dann muß man per date den Namen ermitteln. Ein Blick in einen Kalender führt einen in die Irre, da sich die Kalender wohl alle an ISO 8601 halten...

Exkurs

ISO 8601

In der ISO 8601 ("Data elements and interchange formats -- Information interchange -- Representation of dates and times") steht sinngemäß unter anderem:

Week 01 of a year is per definition the first week that has the Thursday in this year, which is equivalent to the week that contains the fourth day of January. In other words, the first week of a new year is the week that has the majority of its days in the new year. Week 01 might also contain days from the previous year and the week before week 01 of a year is the last week (52 or 53) of the previous year even if it contains days from the new year.

Dieses Zitat stammt von der unter den Links angegebenen Seite [Kuhn]. Auf der Seite [Gent] gibt es unter "Bibliography" auch einen Link auf ISO 8601:2000 Second Edition (Final Draft 2000-12-15). Der endgültige Standard - veröffentlicht am 21. Dezember 2000 - ist nicht online verfügbar, kann aber online bestellt werden, falls man das tun möchte.

strftime

Schaut man unter Linux (hier: Debian GNU/Linux, woody) oder unter Solaris 8 mit man 3 strftime nach "+%V", so wird man gleich auf ISO 8601:1988 und das System, nach dem die Wochen nummeriert werden, aufmerksam gemacht:

man 3 strftime unter Linux zu "+%V"
The ISO 8601:1988 week number of the current year as a decimal number, range 01 to 53, where week 1 is the first week that has at least 4 days in the current year, and with Monday as the first day of the week. See also %U and %W. (SU)
man 3 strftime unter Solaris 8 zu "+%V"
The ISO 8601 week number as a decimal number [01,53]. In the ISO 8601 week-based system, weeks begin on a Monday and week 1 of the year is the week that includes both January 4th and the first Thursday of the year. If the first Monday of January is the 2nd, 3rd, or 4th, the preceding days are part of the last week of the preceding year. [...]

Postskriptum

In den NOTES der Solaris-Manpage erfährt man, daß sich das Verhalten (unter anderem von "+%V") im Solaris 7 Release geändert hat.

The conversion specification for %V was changed in the Solaris 7 release. This change was based on the public review draft of the ISO C9x standard at that time. Previously, the specification stated that if the week containing 1 January had fewer than four days in the new year, it became week 53 of the previous year. The ISO C9x standard committee subsequently recongnized that that specification had been incorrect.

Das ergibt auch komische Effekte. Mir ist das mal mit Procmail passiert: Auf dem Mailserver wurden Mails (mit date) nach Wochen sortiert. Dort lief allerdings ein Solaris < 7, ich arbeitete mit Solaris 8. Die Mails wurden einfach nicht so sortiert, wie ich das erwartet hatte und auch das Debuggen war etwas verwirrend, da das date-Kommando aus meiner Procmail-Konfiguration einfach andere Zahlen lieferte als meine Versuche mit dem gleichen Kommando auf der Shell...

Update

Im Oktober 2009 macht mich Sven Herzberg darauf aufmerksam, dass man das gewünschte Ergebnis bekommt, wenn man %G statt %Y verwendet:

Ich [...] wollte dich nur drauf aufmerksam machen, dass du mit "%V" für die ISO-8601-Wochennummer natürlich doppelt gezählte Wochen bekommst, wenn du %Y benutzt.

ISO 8601 weist einer Woche nämlich nicht nur eine Zahl von 1 bis 53 zu, sondern auch ein Jahr (vgl. "man 3 strftime" - Abschnitt über "%G" für das ISO-8601-Wochen-Jahr).

Wenn du also bei "%Y-W%V" einer Woche die Werte "2003-W01" und "2004-W01" zuweist hast du dein beschriebenes Problem (was die Daten der eigentlichen Woche "2003-W01" überschreibt).

Verwendest du aber "%G-W%V", bekommst du am 2008-12-31 bereits "2009-W01", was zum gewünschten eindeutigen und korrekten Backup-Namen führt.

Wieder einmal ein gutes Beispiel dafür, daß man Manpages zu Befehlen, die man zu kennen glaubt, ab und zu nochmal komplett durchlesen sollte. (Zuletzt hatte ich diesen Effekt bei sort(1), als ich die Option "-n" entdeckte.)

Links

[Gent]
The Mathematics of the ISO 8601 Calendar by Robert Harry van Gent.
[Kuhn]
A Summary of the International Standard Date and Time Notation by Markus Kuhn.

Spambots folgen bitte diesem Link.

<URL:http://www.inacker.de/linux/wochennummern.html>
HTML 4.01 / CSS / WML