UTC-Datum zu Ortszeit und -datum AppleScript

20 Jan 2012 - 11:16

date_from_utc

»date_from_utc« ist die Umkehrung von »date_to_utc«: Der Handler nimmt ein AppleScript-Datum oder eine Liste von Daten, die als Universal Time Coordinated (Greenwich Mean Time) interpretiert werden und liefert sie als AppleScript Datum in der Ortszeit des Mac zurück.

To English Version

Der Handler benutzt System Events und dessen Art, AppleScript-Daten von und zu Property Listen zu wandeln. Die Datumsobjekte werden in einen ISO-Textausdruck gewandelt und eine Property List daraus erzeugt. System Events erzeugt daraus AppleScript-Datumsobjekte. Dies wendet die Zeitzonenumwandlung entsprechend der Olson-Zeitzone Ihres Mac an.

on date_from_utc(list_arg)
	-- Ändert den Wert eines Datums oder einer Liste von Daten
	-- die als Universal Time Coordinated Zeit gegeben sind,
	-- in Ortszeit
	-- Argument kann ein Datum oder eine Liste von Daten sein.
	-- Resultat für ein Datum ist ein Datum,
	-- Resultat für eine Liste ist eine Liste.
	set type_is_list to true
	if class of list_arg is not list then
		set list_arg to {list_arg}
		set type_is_list to false
	end if
	set string_lines to {}
	repeat with J from 1 to count list_arg
		set curr to item J of list_arg
		-- Prüfung auf richtigen Typ. Alles muss Datum sein
		if class of curr is not date then
			error "Non-date value in date_from_utc." number 1700
		end if
		-- Properties aus Datum herausziehen und für richtigen
		-- Textlänge vorbereiten
		set v_list to ¬
			{(year of curr) + 10000, ¬
				(month of curr) + 100, ¬
				(day of curr) + 100, ¬
				(hours of curr) + 100, ¬
				(minutes of curr) + 100, ¬
				(seconds of curr) + 100}
		-- zu Text wandeln, zweiter bis letzter Buchstabe.
		repeat with JI from 1 to count v_list
			set (item JI of v_list) to text 2 thru -1 of ((item JI of v_list) as text)
		end repeat
		set {y, m, d, h, min, s} to v_list
		-- Zeilen für Property List aufbauen
		copy ("<date>" & y & "-" & m & "-" & d & "T" & h & ":" & min & ":" & s & "Z</date>") to end of string_lines
	end repeat
	-- alle erzeugten Zeilen für Property List verbinden
	set old_delims to AppleScript's text item delimiters
	set AppleScript's text item delimiters to return
	set value_string to string_lines as text
	set AppleScript's text item delimiters to old_delims
	
	-- Property List erzeugen
	set plist_string to "<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">
<plist version=\"1.0\">
<array>
" & value_string & "
</array>
</plist>
"
	-- zu Liste von Daten umwandeln
	tell application "System Events"
		set plist to (make new property list item with properties {text:plist_string})
		set r to value of plist
	end tell
	
	-- erstes Element nehmen, wenn Argument im Aufruf keine Liste war.
	if not type_is_list then
		set r to item 1 of r
	end if
	return r
end date_from_utc

Beispiele (mein Mac stand auf australischen Formateinstellungen und der Zeitzone »Australia/Melbourne« für den Test):

date_from_utc({date "Monday, 2 January 2012 1:00:00 PM", date "Wednesday, 16 May 2012 1:00:00 PM", date "Friday, 2 January 1970 1:00:00 PM"})

liefert

{date "Tuesday, 3 January 2012 12:00:00 AM", date "Wednesday, 16 May 2012 11:00:00 PM", date "Friday, 2 January 1970 11:00:00 PM"}

Alle Eingabedaten benutzen 13:00 UTC. Beachten Sie die verschiedenen Ergebnisse in Sommer und Winder und in verschiedenen Jahren für den Sommer.