RSVP - Please Reply

Armin's Spot on the Web


Home

Impressum

My Code


What is a Weblog?

Pictures (.Mac)


NetNewsWire: More news, less junk. Faster

Discussion

Recent Discussion

Create New Topic


AppleScript: Kalenderwoche berechnen

Note: I usually write articles in English, but this a very specific German problem, so I'll write in German for convenience.

Die Regeln für die Kalenderwoche im Deutschen sind überraschend kompliziert. Je nachdem, in welchem Jahr der größere Teil der Woche um Neujahr liegt, gilt die Woche um Neujahr als 53. Woche im alten Jahr oder als 1. Woche des neuen Jahres.

Für JavaScript und Excel gibt es zahlreiche fertige Funktionen, die die Kalenderwoche berechnen, aber in AppleScript habe ich keine Implementation gefunden. Hier ist sie:

(Im Script Editor zeigen!)

on kalenderwoche(d)
	copy d to basedate
	set day of basedate to 4
	set month of basedate to January
	set firstdayoffirstweek to basedate - ((weekdayForDate(basedate) + 5) mod 7) * days
	set calendarweek to ((d - firstdayoffirstweek) div weeks) + 1
	if calendarweek = 53 then
		set year of basedate to (year of basedate) + 1
		set firstdayoffirstweek to basedate - ((weekdayForDate(basedate) + 5) mod 7) * days
		if firstdayoffirstweek < d then
			set calendarweek to 1
		end if
	else if calendarweek = 1 then
		if firstdayoffirstweek > d then
			set calendarweek to 53
		end if
	end if
	return calendarweek as integer
end kalenderwoche

on weekdayForDate(d)
	set wd to weekday of d
	if wd is Sunday then
		return 1
	else if wd is Monday then
		return 2
	else if wd is Tuesday then
		return 3
	else if wd is Wednesday then
		return 4
	else if wd is Thursday then
		return 5
	else if wd is Friday then
		return 6
	else if wd is Saturday then
		return 7
	end if
	
	return -1
end weekdayForDate

on run
	log kalenderwoche(current date)
	log kalenderwoche(date "Donnerstag, 1. Januar 2004 0:00:00")
	log kalenderwoche(date "Mittwoch, 31. Dezember 2003 0:00:00")
	log kalenderwoche(date "Freitag, 31. Dezember 2004 0:00:00")
	log kalenderwoche(date "Samstag, 1. Januar 2005 0:00:00")
end run

Bemerkungen

  • der run handler dient hier nur zu testen, ist nicht Teil der eigentlichen Funktion
  • man kann in AppleScript seit Panther (10.3) die Monatskonstanten (January, February, etc.) in Zahlen umwandeln: (month of (current date)) as number funktioniert. Jedoch liefert (weekday of (current date)) as number einen Fehler: Monday cannot be converted into a number. Deswegen braucht es den Handler weekdayForDate() der den Index des Wochentags übermittelt. (Sonntag ist 1)

Kalenderwochen in iCal einfügen

Der Kalenderwochen Code oben erlaubt es nun schnell und einfach die Kalenderwochen in iCal anzeigen zu lassen, ersetzen Sie im obigen code den run handler durch den folgenden:

(Im Script Editor anzeigen!)

on run
	set theYear to year of (current date)
	display dialog "Bitte das Jahr dessen Kalenderwochen angezeigt werden sollen, eingeben:" default answer theYear
	set theYear to (text returned of result) as number
	set theCalName to "Kalenderwochen"
	display dialog "Bitte Namen des Kalenders in dem die Kalenderwochen angezeigt werden sollen, eingeben:" default answer theCalName
	set theCalName to (text returned of result)
	
	set theDate to date "1.1.2001"
	set year of theDate to theYear
	
	tell application "iCal"
		set x to count of (every calendar where title is theCalName)
		if x = 0 then make new calendar with properties {title:theCalName}
		set theCalendar to first calendar where title is theCalName
	end tell
	
	-- first day of first week
	set d to theDate - ((weekdayForDate(theDate) + 5) mod 7) * days
	
	repeat until year of d > theYear
		tell application "iCal"
			set kw to my kalenderwoche(d)
			set kwstring to "KW " & kw as string
			make new event at the end of events of theCalendar with properties {start date:d, summary:kwstring, allday event:true}
		end tell
		set d to d + 7 * days
	end repeat
end run

Dieses Script für das angegebene Jahr an jedem Montag ein Ganztagesereignis mit der Kalenderwoche einfügen. Falls kein Kalender mit dem angegebenen Namen existiert, wird ein neuer erstellt. Wenn Sie die Kalenderwochen in einem eigenen Kalender führen, können sie einfach ein- und ausgeblendet werden.

Discuss

Google
WWW RSVP.atsites.de

This page was last updated: Saturday, May 15, 2004 at 5:33:47 PM
Copyright 2010 RSVP - Please Reply
Mail me @ arminbatmacdotcom
Create your own Manila site in minutes. Everyone's doing it!