クロック

clockコマンドは、現在の時刻を得たり、時刻と日付/時刻形式の相互変換をする機能を持っています。

現在の時刻を得る

現在の時刻を得る方法は2つあります。

1つはシステム依存の高分解能の値を返すclock clicksです。
CPUのクロックティック単位のカウント値を返します。
-millisecondsオプションでミリ秒単位のカウント値を返します。

clock clicks
=> 1089645
clock clicks -milliseconds 
=> 983625806

もう1つは、現在の時刻をシステム依存の整数で返すclock secondsです。
新世紀からの経過時間を秒数で返します。

clock seconds 
=> 1006006782

時刻→日付/時刻形式変換

現在の時刻を日付/時刻形式文字列に変換するにはclock formatコマンドを使います。
-gmtオプションでグリニッジ標準時に変換できます。

clock format [clock seconds]
=> Sat Nov 17 23:26:38 JST 2001
clock format [clock seconds] -gmt true
=> Sat Nov 16 15:26:38 JST 2001

-formatオプションで書式を与えて変換することができます。

clock format [clock seconds] -format {%Y/%m/%d(%a) %p %I:%M:%S}
=> 2001/11/17(Sat) PM 11:26:38

-formatオプションで指定できるキーワードは以下の通りです。

キーワード説明
%%%に置換する
%a曜日の短縮形式 (Mon, Tue, ...)
%A曜日 (Monday, Tuesday, ...)
%b月の短縮形式 (Jan, Feb, ...)
%B月 (January, February, ...)
%cロケール規定の日付と時刻
%d日/月 (01 - 31)
%H24時間時刻形式の時 (00 - 23)
%I12時間時刻形式の時 (00 - 23)
%j日/年 (001 - 366)
%m月 (01 - 12)
%M分 (00 - 59)
%pAMかPM
%S秒 (00 - 59)
%U週/年 (00 - 52) 日曜日を週の最初の日とする
%w週の番号 (日曜日 = 0)
%W週/年 (00 - 52) 月曜日を週の最初の日とする
%xロケール規定の日付
%Xロケール規定の時刻
%y西暦年の短縮形式 (00 - 99)
%Y西暦年 (2001等)
%Zタイムゾーン
%D%m/%d/%y形式の日付
%e日/月 (1 - 31) 先頭に0を付けない
%h月の短縮形式
%nニューラインを挿入する
%r%I:%M:%S %p形式の時刻
%R%H:%M形式の時刻
%tタブを挿入する
%T%H:%M:%S形式の時刻

日付/時刻形式→時刻変換

日付/時刻形式文字列を時刻に変換するにはclock scanコマンドを使います。
-gmtオプションでグリニッジ標準時に変換できます。

clock scan {1999-10-31}
=> 941295600
clock scan {1999-10-31} -gmt true
=> 941328000

日付/時刻形式の書式は以下の通りです。

# 時刻 (meridian = AM or PM)
hh?:mm?:ss?? ?meridian? ?zone?
hhmm ?meridian? ?zone?

# 日付 (西暦2000年対応)
mm/dd?/yy?
monthname dd ?, yy?
dd monthname ?yy?
day, dd monthname yy
?CC?yymmdd
?CC?yy-mm-dd
dd-monthname-?CC?yy

# ISO 8601日時形式 (T = リテラル)
CCyymmddThhmmss
CCyymmdd hhmmss
CCyymmddThh:mm:ss

修飾子で相対日時を指定することができます

clock scan {1999-10-31 3 day}
=> 941554800
clock scan {1999-10-31 4 hour}
=> 941310000

-baseオプションで基準日を指定することができます。

clock scan "3 day" -base [clock scan {1999-10-31}]
=> 941554800
clock scan "4 hour" -base [clock scan {1999-10-31}]
=> 941310000

相対日時に指定できる修飾子は以下の通りです。

# 単数形
year, fortnight, month, week, day, hour, minute(min), second(sec)
# 複数形
years, fortnights, months, weeks, days, hours, minutes(min), seconds(sec)
# その他
tomorrow, yesterday, today, now, last, this, next, ago
sunday, monday, tuesday, wednesday, thursday, friday, saturday
等

サンプル

clockを使って閏年かどうか調べるプロシジャです。
clockコマンドに任せれば閏年の知識は一切必要ありません。

proc isleapyear {year} {
    if {[catch "clock scan 2/29/$year"]} {
        return 0
    } else {
        return 1
    }
}

isleapyear 2000
=> 1
isleapyear 2001
=> 0

monday修飾子を使ってハッピーマンデー(第2月曜日)の成人式と体育の日を調べてみましょう。

# 成人式
clock format [clock scan "2 monday" -base [clock scan 1/1/2001]] -format "%D"
=> 01/08/01
# 体育の日
clock format [clock scan "2 monday" -base [clock scan 10/1/2001]] -format "%D"
=> 10/08/01

残念ながら、clockコマンドを使っても春分の日と秋分の日は調べられません。(^^;)