ここで書いたテクニックは、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があれば、ややこしい方法なしで数値が使えます。