日付の扱い

1997.3.27


 AppleScriptでの日付の扱いを説明します。

 日付データは専用のデータ形式で表され、表記上は「date "1997年 3月 27日 木曜日 4:08:50 PM"」といった形で表されます。日付データは文字列に変換できますが、文字列そのものではないので注意して下さい。

 現在の日付は、「current date」で日付データとして得ることができます。また、日付データから西暦や月、日、曜日、時間を得たい場合は、それぞれのクラスを指定し、

   年 : year of (current date)
   月 : month of (current date)
   日 : day of (current date)
   曜日: weekday of (current date)
   時間: time of (current date)

 とすることで取得することが可能です。timeは午前0時ちょうどからの秒数で表されますので、時間や分を求めたい場合には次のように自分で計算することになります。

  --{時間,分,秒}のリストを返す

  on SecondToList(Num)
    return {Num div 3600, (Num mod 3600) div 60, (Num mod 3600) mod 60}
  end SecondToString

 また、月は日本語表現型式では「11月」英語では「November」などとなるため、何月であるかを整数で知りたい場合には、条件文などを用いて12カ月分全てを数に変換する作業が必要になります。

on MonthToNum(theMonth)
  set MonthList to {January, February, March, April, May, June, July, August,ツ
             September, October, November, December}
  repeat with i from 1 to 12
    if item i of MonthList is theMonth then
      return i
    end if
  end repeat
end MonthToNum

 また、dateは文字列に変換することができますが、monthやweekdayは不可能です。例えば

  ( current date ) as string

 は"1997年 3月 27日 木曜日 4:08:50 PM"といった文字列を返しますが、

  (month of ( current date )) as string

 はエラーとなります。従って、どうしても月や曜日を文字列で表したい場合は、

  on WeekdayToStr(theWeekday)
    set WeekdayList to {Sunday, Monday, Tuesday, Wednesday,ツ
              Thursday, Friday, Saturday}
    set StrList to {"Sunday", "Monday", "Tuesday", "Wednesday",ツ
              "Thursday", "Friday", "Saturday"}
    repeat with i from 1 to 7
      if item i of WeekdayList is theWeekday then
        return item i of StrList
      end if
    end repeat
    error "正しい曜日ではありません"
  end WeekdayToStr

 といった具合に、全ての月や曜日を自力で文字列に変換する必要があります。

 文字列に変換したdateを1バイト空白文字をデリミタとして文字列のリストに変換するやり方は、スクリプトを利用するユーザの環境によって結果が異なるため止めておいた方が無難です。そのユーザの「日付 & 時刻」コントロールパネルの設定状況を知りたい場合は別ですが。

 新しい日付データは、文字列を日付に変換することで得ることができます。

   date "1972 4 13" → date "1972年 4月 13日 木曜日 0:00:00 AM"

 デリミタは1バイトスペース以外にピリオド(1972.4.13)やスラッシュ(1972/4/13)も使用できるため、柔軟な日付の指定が可能です。スクリプトシステムは与えられた文字列から、できるだけ正しい日付を返そうとします。

 この方法の欠点は、実行されるシステムの言語環境によって左右されることです。例えば英語環境では「年」を「月日」より後に書くため、上の例と同じ結果を得るためには「date "4 13 1972"」とする必要があります。これは不便な話ですが、これを逆手にとってスクリプトの実行された環境を調べることもできます。

 日付データの作成を汎用的に行うためには、current date命令を使って現在の日付を取得してからそれを修正して下さい。次の例では、「1997.4.13」等といった日付を表す文字列を、日付データに変換します。

on StrToDate(theStr)
  set CurDelim to AppleScript's text item delimiters
  if theStr contains " " then
    set theDelim to " "
  else if theStr contains ":" then
    set theDelim to ":"
  else if theStr contains "/" then
    set theDelim to "/"
  else if theStr contains "." then
    set theDelim to "."
  end if
  set AppleScript's text item delimiters to theDelim
  set theStr to text items of theStr
  set theDate to (current date)
  set year of theDate to (item 1 of theStr) as integer
  set month of theDate to NumToMonth((item 2 of theStr) as integer)--別定義
  set day of theDate to (item 3 of theStr) as integer
  set time of theDate to 0 -- 時間は0に設定
  set AppleScript's text item delimiters to CurDelim
  return theDate
end StrToDate

  註)NumToMonth(theNum) は自作ライブラリ収録のオリジナル関数です。


 ところで、日付は足し算と引き算ができます。基本となる単位は秒ですので、

   (current date) - 3600

 とすれば現在から1時間前の日付を日付データとして得ることができます。また、日付同士を加減することもできます。

   date "1997 3 27" - date "1996 3 27"

 これは秒を整数で返します。上の例では「31536000」が返されます。

 Macの時間の基準は1904年の最初ですので、基準時間からの経過時間は

   theDate - (date "1904 1 1")

 とすれば求められます。

 AppleScriptの日付で表すことができるのは、西暦1000年1月1日から西暦9999年12月31日までです。西暦999年以前を表せないのがちょっと残念ですが、未来については全く問題ありませんね。


 以上、AppleScriptに於ける日付の扱いでした。


Tipsに戻る
AppleScriptのページに戻る
このホームページに関するお問い合わせは、karino@drycarbon.comまで。