Suchen / SearchNavigation |
AppleScript Datumsstrings mit PHP analysieren1 Aug 2010 - 18:51 Hier geht es um eine String-zu-Datum-Umwandlung in AppleScript mit Hilfe von PHP. Es gibt Fälle, in denen es sehr aufwändig ist, einen Datumsstring selbst zu analysieren und man sich besser auf auf die Arbeit anderer stützt. In E-Mail-Headers finden Sie Datumsbeschreibungen wie Es gibt Varianten wie Alte Software kann Strings erzeugen wie Dies gibt wieder eine Zeitzone an, aber die Bravo-Zeitzone der Military Time Zones. Das ist veraltet, aber zulässig in einer E-Mail. Wollen Sie alle Varianten sehen, lesen Sie RFC 2822. Der Text ist sehr technisch. Ein SOAP-Request kann eine Antwort erhalten wie All diese Zeichenfolgen sind nur unterschiedliche Formen für »6. Juli 2010 10:07:27 Mitteleuropäische Sommerzeit«. Ein Handler, der PHP nutztEine Funktion, die diese Varianten beherrscht, ist PHPs strtotime. Der folgende Handler nutzt sie via do shell script. (* Details for the formats understood can be found on http://de.php.net/manual/en/datetime.formats.php Specification of date / time in Internet mail: http://www.ietf.org/rfc/rfc2822.txt limits: for UTC 19. Jan 2038 03:14:07 13. Dec 1901 20:45:52 Hints: use do shell script ("php -r 'print (@date_default_timezone_get());'") to see what PHP assumes about your time zone *) on parse_date_string(ts) -- parses a date string using PHP strtotime. -- Returns an AppleScript date -- Time is in your local time zone --limits: --19. Jan 2038 03:14:07 UTC --13. Dec 1901 20:45:52 UTC set php_cmd to "php -r " set php_script to ¬ "$x = @strtotime($argv[1]); if ($x === false) print \"error\"; else print (@date ( \"Y-n-j-G-i-s\", $x ));" set php_script to quoted form of php_script set php_arg to quoted form of ts set sh_script to php_cmd & php_script & " " & php_arg --log sh_script set dt to (do shell script sh_script) -- let us throw an error if parsing went wrong -- change the if line if you need something else -- return false -- may be an alternative if you want to react on problems -- without a try … on error block. if dt = "error" then error "Handler parse_date_string could not parse string “" & ts & "”" number -30720 end if set the_date to current date set day of the_date to 1 set {year of the_date, month of the_date, day of the_date, hours of the_date, minutes of the_date, seconds of the_date} to every word of dt return the_date end parse_date_string Das sind nicht viele Zeilen für das, was der Handler macht. Beachten Sie den Limit-Kommentar: Unix-Zeitstempel werden benutzt, und die funktionieren nicht außerhalb der Grenzen. Die strtotime-Funktion erledigt viele praktische (und lustige) Dinge. Z.B. liefert »last Saturday of November« den letzten Samstag im November des laufenden Jahres. »last Saturday of November 2012« findet diesen Samstag im Jahr 2012. Details über die unterstützen Formate finden Sie im PHP-Handbuch. Hinweise zum PHP-CodeDer Handler erzeugt ein Shell Script aus drei Teilen: einem Aufruf des PHP-Interpreters (php_cmd), einem konstanten PHP-Script (php_script) und einem Argument für dieses Script (php_arg). Das PHP-Script selbst ist ein konstanter String. Das hat Sicherheitsgründe: Ein Script aus Benutzereingaben zusammenzubauen hat viele gefährliche Aspekte (Hier einige Details zu dem Sicherheitsproblem). Die Verwendung der »quoted form«-Eigenschaft für das Argument ist auch Teil der Sicherheit. Der Code wird mit »do shell script« ausgeführt. Das ganze shell script beginnt mit »php -r«, wsa der shell nur sagt, dass PHP den Rest ausführen soll. Beachten Sie, dass zwei Funktionen im PHP-Code, »strtotime« und »date« ein vorangestelltes »@« haben. Dies ist der PHP-Operator zum unterdrücken von Warnungen. Aktuelle PHP-Versionen verlangen, dass Sie die Zeitzone festlegen, bevor die Funktionen benutzt werden. Unterlassen Sie dies, gibt PHP eine Warnung aus (hier vom @ unterdrückt) und versucht, die Information vom Betriebssystem zu bekommen. Dies funktioniert mit Snow Leopard gut. Und Zeitzonen des Betriebssystem sind hier genau, was ich brauche. (Wollen Sie wissen was PHP über die System-Zeitzone annimmt, führen Sie folgende Zeile im Script Editor aus: »strtotime« versucht, einen Datumsstring in einen Unix-Zeitstempel für Universal Time Co-ordinated (auch Greenwich Mean Time) zu wandeln. Gibt der Datumsstring vollständige Informationen wie in »06 Jul 2010 10:07:27 +0200«, wird die Zeit entsprechend der -0200-Zeitzone gewandelt. Fehlt die Zeitzone (»6 Jul 2010 10:07:27«), wird die lokale Zeit des Mac angenommen. »date« liefert einen String für den Zeitstempel, für AppleScript-Analyse einfach formatiert. (Das Format gibt der String »Y-n-j-G-i-s« an: Jahr, Monat, Tag, Stunde, Minute und Sekunde, je mit »-« getrennt.) Für diese Umwandlung wird die Zeit in Ihre lokale Zeitzone gewandelt. Und dies nutzt der Handler, um die Werte der Variablen »the_date« zu setzen.
|
AppleScript Datumsobjekte und -berechnungen |