Section 3.19 時計の実装(番外編1)

時計のスクリプトは前回で完成したんだよね?
うん。
じゃあ今回は何をするの?
今回はアラームを鳴らす時刻を別のやり方でチェックしようと思うんだ。
アラームを鳴らす時刻のチェックって、§3.16 で作った ClockWindow クラスの checkAlarm メソッド のこと?
ん。それと、§2.4 で作った Clock クラスの getTime メソッド と、 getAlarmTime メソッド もね。
アラームを鳴らす時刻って、getTime メソッド で取得できる今の時間と、 getAlarmTime メソッド で取得できるアラームの時間を比較してチェックしてたよね?
そうだよ。
他にアラームをチェックする方法があるってこと?
うん。今回は Date クラスの getTime メソッドを使ってチェックするの。
Date クラスの getTime メソッド…って今まで使ったことないメソッドだよね?
そ。今回初めて使うメソッドだよ。
それってどんなメソッドなの?
Date クラスの getTime メソッドは、1970年1月1日午前0時からの経過時間をミリ秒単位で取得できるメソッドなんだ。
1970年1月1日午前0時からの経過時間?
例えば、2007年1月1日の午前0時ちょうどにこのメソッドを呼び出すと、 2007年1月1日は1970年1月1日から数えて13514日後だから、13514(日)×24(時間)×60(分)×6000(ミリ秒)=1167609600000っていう値が返ってくるんだ。
1兆1676億960万…ってなんかすごい値だねぇ…
ま、37年をミリ秒にしてるわけだからね。
ちなみに、Date クラスの getTime メソッドは協定世界時(UTC)を基準にしてるから、 このメソッドを呼び出した時に 1167609600000 が返ってくるのは、日本だと2007年1月1日の午前9時になるんだけどね。
えっ??
あー、別にそんな細かいことはわからなくてもアラームの時刻チェックはできるから、気にしないで。
そ、そうなの?
要するに、Date クラスの getTime メソッドを使うと、 アラームを鳴らす時刻になったかどうかが簡単にチェックできるってこと。
どうやって?
まず、Clock クラス のメンバ変数と getTime メソッドsetAlarmTime メソッドgetAlarmTime メソッド をこう書き換えるんだ。

// var alarm_hour, alarm_min, alarm_sec;  // アラームを鳴らす時、分、秒 → この3つのメンバ変数は削除します
var alarm_time;  // アラームを鳴らす時刻(1970/1/1 0:00からの経過ミリ秒)← 代わりにこのメンバ変数を追加します

// 現在の時刻(1970/1/1 0:00からの経過ミリ秒)を返します
function getTime()
{
    var d = new Date();
    return d.getTime();
}

// 今から minute 分後にアラームをセットします
// 戻り値はありません
function setAlarmTime(minute)
{
    // alarm_time に 今から minute 分後 = 今から (minute * 60000) ミリ秒後 の時刻をセットします
    alarm_time = getTime() + minute * 60000;
    alarm_on = true;
}

// アラームを鳴らす時刻(1970/1/1 0:00からの経過ミリ秒)を返します
// アラームがセットされていない場合は void を返します
function getAlarmTime()
{
    return alarm_on ? alarm_time : void;
}

う〜ん、確かに前よりは全体的に短くなってるみたいだけど、どうやってアラームを鳴らす時間になったかチェックするの?
ClockWindow クラスの checkAlarm メソッド をこう書き換えればチェックできるようになるよ。

// アラームを鳴らす時刻になっていれば true、なっていなければ false を返します
function checkAlarm()
{
    var alarmTime = clock.getAlarmTime();  // アラームの設定時刻を取得します
    if(alarmTime === void)  // アラームがセットされていない場合は
        return false;      // false を返します

    // アラームの設定時刻を過ぎているかどうかを返します
    return clock.getTime() >= alarmTime;
}

戻り値になってる条件式が前と違ってるね。
ん、じゃその辺を説明してくね。
うん。
まずは getTime メソッド から。
って言っても、これは特に説明する必要ないよね。
Date クラスの getTime メソッドの戻り値をそのまま返してるんだよね。
ん、そう。
それじゃ次は setAlarmTime メソッド ね。
このメソッドって、前に作ったのよりかなりシンプルになってるよね?
前はアラームを鳴らす時、分、秒を別々に計算してたからね。
Date クラスの getTime メソッドを使うと、ミリ秒の単位だけ計算すればいいからシンプルにできるんだ。
これって、Clock クラスの getTime メソッドの戻り値に minute * 60000 を足した値がアラームを鳴らす時刻になるってこと?
そうだよ。
まず、分をミリ秒に直すためには、1分=60秒=60000ミリ秒 だから 60000 倍しなくちゃいけないってのは解るよね?
うん。
minute 分後は minute * 60000 ミリ秒後ってことだよね。
そ。getTime メソッドの戻り値は今の時刻をミリ秒単位で表した値になってるから、 それに minute * 60000 を足せば、 今から minute 分後の時刻、つまりアラームを鳴らす時刻を指す値になるわけ。
なるほど、確かにそうなるね。
で、今回は getTime メソッドの戻り値に minute * 60000 を足したこの値だけでアラームを鳴らす時刻が表せるから…
alarm_time っていう変数が1つあればいいってことなんだよね?
そういうこと。
後は getAlarmTime メソッド だけど、 これはアラームがセットされてたら alarm_time の値を返して、 セットされてなかったら void を返してるだけ。
今回は辞書配列を使ってないから見た目もシンプルになってるね。
うん。
じゃあ、最後は checkAlarm メソッド
これって、今の時刻の値がアラームを鳴らす時刻の値以上だったら true を返してるんだよね?
そうだよ。何でそうしてるかは解るよね?
えっ?
え〜っと…今の時刻の値がアラームを鳴らす時刻の値以上になってるってことは、 今の時刻がアラームを鳴らす時刻を過ぎてるってことだからかなぁ…?
ん、そう。
時刻を表す値は 1970/1/1 0:00AM からの経過時間になってるから、 今の時間の値と過去の時間の値を比べると、今の時間の値の方が大きくなるし、 今の時間の値と未来の時間の値を比べると、未来の時間の値の方が大きくなるよね。
そっか。つまり、アラームを鳴らす時間になってるってことは、アラームを鳴らす時間が過去ってことになるから、 今の時間の値とアラームを鳴らす時間の値を比べると、今の時間の値の方が大きくなるんだね。
そうそう。
ちなみに、こうするとアラーム設定の上限をなくすこともできるんだ。
アラーム設定の上限って?
今まではアラームは 1439 分後までしか設定できなかったでしょ。
あ〜、確か日付を考えてないから 1439 分後までしか設定できないって §1.10 で言ってたよね。
そ。でも今回は 1970/1/1 0:00AM からの経過時間で時刻を表してるから、 1440×60000 ミリ秒後って設定すれば 1440 分後にアラームを鳴らせるよね。
あ、そうだね。確かにこのやり方だと何分後でも設定できるよね。
ま、厳密には上限はあるんだけど、2億9000万年くらい先までなら設定できるよ。
に、2億って…
ってワケだから、実質的には上限はなくなるね。
う、うん。そだね…
んじゃ、今回の内容をまとめたスクリプトをここに置いとくから、 実際に実行して試してみてね。
はーい!
今回説明したメソッド以外にもちょっとスクリプトを変えてるところもあるんだけど、 そんなに大した変更じゃないから、スクリプトを見て確認しといてね。
うん、りょーかい。
じゃ、今回はここまで。
次回で第3章は最後だよ。
あ、次回で終わりなんだ。
うん。第3章は色々やったからだいぶ長くなっちゃったけどね。
それじゃ、また次回ね!


前へ | TOP | 次へ