Hier schon mal etwas Theorie zum Thema "Datum und Zeit".
Das aktuelle Datum samt Zeit in eine Variable zu bekommen ist einfach:
Code set curDate to (current date) Das Ergebnis -->date "Freitag, 20. August 2004 7:37:30 Uhr" ist keine Textkette (string), sondern im Format 'date'. Wenn man das Datum, so wie es ist, irgendwo einsetzen will, dann kann man dem Befehl den Zusatz 'as string' anhängen und hat dann eine Textkette: "Freitag, 20. August 2004 7:37:30 Uhr".
Wenn aber das Resultat verändert (Name des Wochentages weglassen, Kurzform = 20.08.04) oder/und wenn die Uhrzeit in einen Dateinamen aufgenommen werden soll, dann ist es einfacher, die Infos aus dem 'date' auszuziehen.
Angenommen, dieses Beispieldatum soll ins Format "_040820_073730" umgewandelt werden (Jahr, Monat, Tag, damit es mit dem Sortieren klappt).
Die einzelnen Bestandteile werden aus der Variablen 'curDate' ausgezogen:
Code set yy to year of curDate -->2004 Damit nur die zwei letzten Stellen in die Variable 'yy' gegeben werden, verlangt man den 'text -2' (= zweitletzter Buchstabe) bis '-1' (= letzter Buchstabe) des Jahres von 'curDate'. Weil das Jahr im Format 'integer' (= Ganzzahl) ist, muss es für diese Operation in einen 'string' (= Textkette) umgewandelt werden. Man kann wieder 'as string' einsetzen. Oder die kürzere Form anwenden, mit welcher 'year of current date' mit dem Zeichen '&' an einen leeren String gehängt und so automatisch ins selbe Format konvertiert wird:
Code set yy to text -2 thru -1 of ("" & (year of curDate)) -->04 Der Monat ist eine besondere Knacknuss.
Code set mm to month of curDate -->August Das Resultat ist keine Textkette (die Anführungszeichen fehlen), sondern eine englische Konstante (April, August, September und November sind die Namen, welche in deutsch und englisch übereinstimmen). Um die Nummer des Monats herauszukriegen, könnte man einen Test aufstellen:
---
if mm = January then
set mm to "01"
else if mm = February then
set mm to "02"
else if mm = March then
set mm to "03"
usw. usf.
Code Es gibt aber eine kürzere Formel, welche nicht so einfach zu verstehen ist: copy curDate to tempDate
set month of tempDate to January
set mm to text -2 thru -1 of ("0" & ((curDate - tempDate) div 2500000) + 1) -->"08"
---
Zuerst wird 'curDate' in eine zweite Variable kopiert. Hier ist das 'copy' zwingend. Weil nach einem 'set' mit dem Befehl der zweiten Zeile auch der Inhalt von 'curDate' verändert würde. Den Beginn der dritten Zeile haben wir schon beim Jahr kennengelernt. Hier wird aber das Resultat nicht an einen leeren String angehängt, sondern an "0". Damit wird bei einstelligen Werten eine Null eingefügt. Das Resultat aus '(curDate - tempDate)' ist die Anzahl Sekunden zwischen dem heutigen Tag und dem gleichen des Monats Januar. Dieses Ergebnis wird mit 'div' durch 2500000 geteilt (man kann eine beliebige Zahl zwischen 2419200 und 2505600 verwenden). Man erhält eine Ganzzahl, welche um 1 kleiner ist, als die richtige Lösung. Deshalb muss am Schluss '+ 1' stehen.
Unter Mac OS X ist dies alles viel einfacher, denn die Nummer kann direkt verlangt werden.
Code set mm to text -2 thru -1 of ("0" & (month of curDate as number)) -->"08" Das Ausziehen des Tages ist leicht:
Code set dd to text -2 thru -1 of ("0" & (day of curDate)) -->"20" Hier wird die vorangestellte Null nicht gebraucht. Aber mit Werten unter 10 wird sie eingefügt.
Die Uhrzeit kann mit 'time string of curDate' ausgezogen werden.
Code set ts to time string of curDate -->"7:37:30 Uhr" Drei Probleme:
1) Bei Werten von 0 bis 9 muss eine führende Null eingefügt werden.
2) Die Doppelpunkte dürfen nicht in einem Dateinamen verwendet werden.
3) Der (läppische) Zusatz " Uhr" muss weg.
---
set c to offset of ":" in ts
set h to text -2 thru -1 of ("0" & (text 1 thru (c - 1) of ts))
set m to text (c + 1) thru (c + 2) of ts
set s to text (c + 4) thru (c + 5) of ts
---
Zuerst wird in die Variable 'c' die Position des ersten ':' gesetzt. Dann wird dieser Wert benutzt, um den Variablen 'h', 'm' und 's' die entsprechenden Werte zuzuweisen.
Hier das ganze Mac-OS-9-Script auf einen Blick:
---
set curDate to (current date)
copy curDate to tempDate
set month of tempDate to January
set yy to text -2 thru -1 of ("" & (year of curDate))
set mm to text -2 thru -1 of ("0" & ((curDate - tempDate) div 2500000) + 1)
set dd to text -2 thru -1 of ("0" & (day of curDate))
set ts to time string of curDate
set c to offset of ":" in ts
set h to text -2 thru -1 of ("0" & (text 1 thru (c - 1) of ts))
set m to text (c + 1) thru (c + 2) of ts
set s to text (c + 4) thru (c + 5) of ts
set finalDate to ("_" & yy & mm & dd & "_" & h & m & s) -->"_040820_073730"
---
Das Ergebnis zählt immerhin 14 Zeichen. Dies ist eventuell zu viel, um an einen Dateinamen angefügt zu werden. Eine Variante wäre, die Sekunden, welche ab einem fixen Datum bis jetzt verstrichen sind, zu benutzen.
---
set fixDate to date "Donnerstag, 1. Januar 2004 0:00:00 Uhr"
set curDate to current date
set nSecs to "_" & (curDate - fixDate) -->"_20072250"
---
Nur noch neun Zeichen. Und ebenfalls ein unverwechselbarer Stempel. Nun … so in drei Jahren müsste man sich die Sache nochmals vornehmen...
Hans Haesler <hsa@ringier.ch>