日付属性の設定方法

まとめて属性を設定(その1)

 幾つかまとめて属性を設定したい時がありますが、そのような時は、以下のように書けば一気に設定できます。これは日付に限ったことではありません、詳しくは「値をリストでまとめる」の方を参照して下さい。
 何故か、月を指定する時には「of it」か「of 日付(この場合theDate)」を付けなければいけません。属性の値が定数であることが問題なのかもしれません。
 月の設定のところでも書いたように、月が狂う可能性があるので、月の設定の前に一旦1日に設定しています。ひっじょーに面倒です。Appleさん、何とかして下さい。

set theDate to (current date) -- date "1" of (current date)とすれば、後で1日を設定する必要は無い
tell theDate to set {year, day, month of it, day, time} to {1999, 1, December, 3, 0}

今日かどうかを調べる

 日付は比較可能ですが、今日か昨日か等を調べるとなると、とっさに方法が思い付かないかもしれません。例えば以下のように、timeに0を設定して調べます。
 月頭や年頭にしても同様にして設定していけばすぐに得られるというのは判ると思います。

set today to current date
set time of today to 0 -- 今日の0時丁度に設定
tell application "Finder"
	if modification date of (choose file) >= today then
		display dialog "今日のファイル"
	else
		display dialog "昨日以前のファイル"
	end if
end tell

まとめて属性を設定(その2)

 もうひとつ、まとめて属性を設定する方法として、date "..." of (current date)を使う方法があります。これは前の方法よりもさらに簡単に一度に指定できますが、書式はコントロールパネルの日付の設定に依存するので、公開を前提としたスクリプトには使えません。
 コロン(:)が文字列に含まれる場合は時刻、ピリオド(.)かスラッシュ(/)が含まれる場合は日付として認識されます。また、書式に合わない場合はとりあえず書式の右側のものと認識します。
 設定に依存しますが、例えば、":0"は0時丁度、"1"は一日、同じく"1."や"1"も一日と認識されます。
 時刻の書式に続けてスペースを入れた後"am","pm"を書き午前午後を指定することもできます。例えば"11:0 pm"といった具合。
 値の範囲は、1000年1月1日〜9999年12月31日までで、それ以外の日付は適当に変換されます(例えば98年は1998年に変換されます)
 日付は"年.月.日","月.日","日"の指定が可能で、その順番はコントロールパネルの設定に依存します。年や月が指定されない場合は、特に年や月の値は変化しません。
 時刻は"時:分","時:分:秒"の指定が可能で、順番は入れ替え不可。秒が指定されない場合は00が設定されます。
 日付と時刻はスペースを間に置いて、一度に書くこともできます。

date "12:00:00" of (current date) -- 今日の12時丁度
date "0:0:0" of date "1.1" of (current date) -- 今年の始まり
date "11:0 pm" of (current date) -- 今日の午後11時
date "1" of (current date) -- 今月の1日の現在時刻
date "1945.8.6 0:0" of (current date) -- 原爆が広島に投下された日

第二月曜日

 ハッピーマンデー法が施行されて、第二月曜日を求めたくなる機会が増えたと思いますが、これもすぐに思い付くものでもありません。
 以下は今月の第二月曜の日付を求めるスクリプト。getWeekday()は「月・週の扱い」で作ったもの。
 たかだか第二月曜を求めるだけに大袈裟ですが、AppleScriptの日付の扱いはこんなものであるようです。

set tarDay to current date
set day of tarDay to 1 -- 今月の1日に設定
set x to 1 + (2 - getWeekday(tarDay)) -- 1日+(月曜の番号(2) - 1日の曜日番号)
if x < 0 then
	set x to x + 14
else
	set x to x + 7
end if

display dialog "今月の第二月曜は" & x & "日です"

 汎用性は落ちますが、リストを利用すると以下のように書けます。要するに、1日の曜日が判れば、第二月曜が何日になるかは決まっているわけなので、それをリストにする訳です。ついでにハンドラにしました。
 レコードを使えば良さそうに思えますが、残念ながらAppleScriptでは、属性の指定に変数を利用することはできないので、ちょっと回りくどい書き方になっています。

display dialog "今月の第二月曜は" & the2ndMonday(current date) & "日です"

on the2ndMonday(theDate)
	set day of theDate to 1 -- 今月の1日に設定
	item getWeekday(theDate) of {9, 8, 14, 13, 12, 11, 10}
end the2ndMonday

カレンダーを作る

 これまで学習したことを元にして、カレンダーを作ってみることにします。getWeekday()は、「月・週の扱い」で作ったもの。
 うーむ、もう少しカッコよくできそうなもんですが、とりあえずこんな感じで。

display dialog calendar(current date)

on calendar(theDate)
	-- 今月の1日の曜日を求める
	set day of theDate to 1
	set weekdayOf1stDay to getWeekday(theDate)
	-- 現在の月を保存
	set curMonth to month of theDate
	-- カレンダーの最初の日を設定
	set theDate to theDate - weekdayOf1stDay * days
	
	
	set theCalender to ""
	repeat
		set theWeek to ""
		repeat with i from 1 to 7
			set theDate to theDate + days
			if curMonth = month of theDate then
				set theWeek to theWeek & (text -2 thru -1 of ("0" & (day of theDate))) & "   "
			else
				set theWeek to theWeek & "--   "
			end if
		end repeat
		-- 週の全てが別の月になった時に終了
		if theWeek = "--   --   --   --   --   --   --   " then exit repeat
		set theCalender to theCalender & return & theWeek
	end repeat
	theCalender
end calendar

 Tanaka's osaxのMT DateListを使えば、日付を数値か文字列のリストで得ることができます。MT Convert Dateで、文字列やリストから日付の値を得ることもできます。MT Timestampを使えば、文字列で"yymmddhhmmss"のタイムスタンプを得ることもできます。


2000-02-13 -2000-03-29