月・週の扱い

Mac OS X10.4での変更

 ここで書いたテクニックは、Mac OS X10.4(Tiger)以降では、不要になっています。
 month、weekday、はas integerによって整数に変換できます。
 hours、minutes、secondsの属性もつけられたので、それぞれの定数を使って変換する必要も無くなっています。
 (month of (current date)) as integerについては、10.3でも可能です。
 詳しくは、Basic/値のクラス/dateを参照してください。

定数と数値の変換

 日付のweekday属性は数字では無く定数で扱われます。
 非常に面倒臭いし使いにくい。そこで数値で扱う方法を紹介します。

getWeekday(current date)

on getWeekday(theDate)
	set theWeekday to weekday of theDate
	repeat with i from 1 to 7
		if theWeekday = item i of {Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday} then return i
	end repeat
end getWeekday

 ちなみに、MacOS8.6以降ならば、定数を文字列に変換できるので、以下のようなスクリプトも可能です。
 標準ではリストに対応したoffset命令は無いので、一旦文字列にするという訳です。

getMonth(current date)

on getMonth(theDate)
	set theMonth to (month of theDate) as string
	((offset of theMonth in "January  February March    April    May      June     July     August   SeptemberOctober  November December") + 8) / 9
end getMonth

 逆に数字で月を指定したい時は、以下のような感じでやります(曜日の方は[r/o]であり、指定できない)
 ただし、current dateで得られる値が31日などである場合、31まで日にちが無い月を指定すると、次の月の1日(若しくは2か3日)に変換されてしまうので、必ずその月に設定したいという時は、dayに28以下の日を設定します

set theDate to (current date)
set day of theDate to 1
set month of theDate to num2Month(5)

on num2Month(n)
	item n of {January, February, March, April, May, June, July, August, September, October, November, December}
end num2Month

 日付の値を文字列に変換した後、wordで取り出す方法もありますが、環境によって異なる結果となるので、使わない方がいいでしょう。

月を数字で取り出す

 別の方法として、ひたすらに数字をいじることでも、月を数字で取り出すことができます。

getMonth(current date)

on getMonth(theDate)
	copy theDate to aNy -- 日付をcopyするsetでは値が共有されるので都合が悪い
	tell aNY to set {day, month of it} to {1, January}  -- その年の1月1日を設定
	return ((theDate - ((day of theDate) * days)) - aNY) div (days * 29) + 1
end getMonth

 最後の行がややこしいので、細かく解説します。
 まず、問題の日付(theDate)から日数分の秒数(day of theDate)を引くことで、現在の月の直前日を得ます。

theDate - ((day of theDate) * days)

 そして、その年の1月1日の日付(aNY)を引くと、その年が始まってからおおよその積算秒数が求まります。
 さらに29日分の秒数で割り余りは切り捨て、1を引くと月が数値として求まります。

- aNY) div (days * 29) + 1

 それというのも、ひと月は30日近くあるので、多少の誤差はこの部分で吸収されてしまうからです。
 いろいろと大雑把ですが、とにかく月が数値で求まります。
 逆にその年の1月1日に29*m*daysを加えて月を設定することもできます(mは月の数値)
 そのとき日付は、一月は30日、二月は28日と少しずつ減っていき、最終的に十二月は14日か15日(閏年かそうで無いかで違う)となります。
 あとで、適当な日付を設定するといいでしょう。

setMonth of (current date) to 12

on setMonth of theDate to m
	tell theDate to set {day, month of it} to {1, January} -- その年の1月1日を設定
	return theDate + 29 * m * days
end setMonth

曜日を数値で求める

 月と同様に曜日もひたすら計算で求めることができます。
 これは「ある年ある月のある日曜日」からの日付の差を7で割った余りに1足せば数値で求まります(日曜を1として、順次2,3,4,5,6,7となる場合)
 dateの範囲が"1000.1.1"からで"1000.1.5"が日曜日なので、ここからの日付の差を求 めます。

getWeekday(current date)

on getWeekday(theDate)
	copy theDate to baseDate -- 日付をcopyするsetでは値が共有されるので都合が悪い
	tell baseDate to set {year, day, month of it} to {1000, 5, January}
	return (((theDate - baseDate) div days) mod 7) + 1
end getWeekday

 Tanaka's osaxのMT DateListを使えば、日付を数値か文字列のリストで得ることができます。MT Convert Dateで、文字列やリストから日付の値を得ることもできます。MT Timestampを使えば、文字列で"yymmddhhmmss"のタイムスタンプを得ることもできます。
 最初に書いたように、Mac OS X10.4があれば、ややこしい方法なしで数値が使えます。


2000-03-29 -2000-03-31 -2005-07-03