新JavaScript入門  JavaScript,Neo-Generation  DOM  WSH  掲示板  表紙
12.ユーザー定義オブジェクト  14.Button 
新JavaScript入門
13. Date
Dateオブジェクトの作成
Dateオブジェクトの作成には次のような方法があります。
    1. d = new Date();
    2. d = new Date("month day, year hours:minutes:seconds");
    3. d = new Date(year, month, day);
    4. d = new Date(year, month, day, hour, min, sec);
 
1 のフォーマットでは Date オブジェクトは現在の日時で初期化されます。 2 〜 4 では指定した日時で初期化されます。
気を付けなければならない点は、
    現地時間である。
    2の month は "July" などと英語で書きます。
        ただし、よく使われる3文字までの短縮形(例えば、"Jul")
        はOKのようです。
    3では時間は0時0分0秒に初期化されます。
        3と4の year は2桁の場合は1900年代を表わします。
    3と4の monthはCのtm構造体と同様に 0 〜 11 の値を取り、 
        0は1月を表わします。
 
くらいでしょう。
日時の比較
日時は以下の3つの方法でシリアル値にすることができます。
    date.getTime();
    Date.parse(dateString)
    Date.UTC(year, month, day [, hrs] [, min] [, sec])
 
いずれも、標準時の1970年1月1日0時0分0秒から経過時間をmsで返します。
dateDateオブジェクトです。 dateString は例えば "Nov, 5 1997 00:00:00 GMT+0900" のようにしますが、 "Nov, 5 1997 00:00:00" とGMTをつけなければローカルタイムと解釈されます (どのような文字列がシリアル値に変換されるのかはよく分かりません)。
UTC の引数はコンストラクタに準じますが、 引数は標準時のものです。

これを用いて、以下のように日付の比較ができます。

    var salemillisec = Date.parse("Nov, 5 1997 00:00:00");
    var todaymillisec = (new Date()).getTime();
    if(todaymillisec < salemillisec)
        alert("4巻はまだ発売されていません");
    else if(todaymillisec - 24 * 60 * 60 * 1000 < salemillisec)
        alert("今日は4巻の発売日です");
    else
        alert("4巻はもう発売されました");
 
逆にシリアル値からDateオブジェクトの変換は setTimeメソッドを用いて行ないます。
    //今から1時間後の時刻をセットする
    d.setTime((new Date()).getTime() + 60 * 60 * 1000);
 
Dateオブジェクトの内部値
Dateオブジェクトの内部値は、 1970年1月1日0時0分0秒からの経過時間をミリ秒で表わしたものになっています。
    d = new Date(70, 0, 1, 9, 0, 0);
    alert(d * 1);                       //0
    d = new Date(70, 0, 1, 9, 0, 1);
    alert(d * 1);                       //1000
 
日本では
時差 の関係で1970年1月1日9時0分0秒からの経過時間です。 この関係で Dateオブジェクトが取りうる値は、 いちおうこの時間からということになっています。 このことから Dateオブジェクト も大小比較ができることが容易に想像できます。
    var dsale = new Date(97, 11, 5);            //発売日
    var dtoday = new Date();                    //今の時間
    if(dtoday < dsale)
        alert("4巻はまだ発売されていません");
    //発売日の午前零時から24時間経過していなければ
    else if(dtoday - 24 * 60 * 60 * 1000 < dsale)
        alert("今日は4巻の発売日です");
    else
        alert("4巻はもう発売されました");
 
また、内部では ms 単位で値を保持しています (実際にはOSに依存すると思われます)。
    var isplaying = false;
    var dstart, dend;
    
    function test5(form) {
        if(isplaying) {             //2回目
            dend = new Date();
            //1回目との差をとる
            form.text1.value = dend - dstart;
        }
        else                        //1回目
            dstart = new Date();
        isplaying = !isplaying;
    }
 
ボタンを2回押してください。ボタンを押した間隔が ms 単位で表示されます。 ただしあまり速くボタンを押してはだめのようです。
取得メソッド
Dateオブジェクトから 年、 月、 日、 曜日、 時、 分、 秒 を得るにはそれぞれ、 getYeargetMonthgetDategetDaygetHoursgetMinutesgetSeconds を用います。 例えば次のようです。
    var year = parseInt(form.text1.value);
    var d = new Date(year, 2, 0);      //その年の3月1日の前の日
    alert(d.getDate() == 29
            ? "閏年ですわ" : "閏年ではありませんわ");
 
2000 などと年を表わす数字を入力してボタンを押してください。 その年の3月1日の前日が29日か否かで閏年の判定をしています。
ここでもいくつか気を付けるべき点があります。
    getYear は1900年代は2桁、
        その他ではそのままの数字が返ります。
    getMonth は 0 〜 11 を返します。
    getDay は 0 〜 6 を返し、
        0 は日曜日、 1 は月曜日、 … を表わします。
 
設定メソッド
同様に、 年、 月、 日、 時、 分、 秒 を設定するにはそれぞれ、 setYearsetMonthsetDatesetHourssetMinutessetSeconds を用います。例は次の13日の金曜日を表示するプログラムです。
    //次の13日を得る
    var d = new Date();
    var m = d.getMonth();
    if(d.getDate() < 13)
        d.setMonth(m++);
    d.setDate(13);
    var next13serial = d.getTime(); //次の13日のシリアル値
    for( ; d.getDay() != 5; m++) {  //金曜日になるまで月を1増す
        d.setTime(next13serial);    //元に戻してから
        d.setMonth(m);              //次の月を設定する
    }
    alert("次の13日の金曜日は\n" + d.getYear() +
                  "年" + (d.getMonth() + 1) + "月13日 です");
 
設定系のメソッドは通常の範囲外の値をセットするときに注意が必要です。 例えば13月をセットするとその次の年の1月になります。
    var d = new Date(2003, 4, 18);  //2003/5/18
    d.setMonth(12);                 //13月を設定
    alert(d.toLocaleString());      //2004年1月18日 0:00:00
    d.setMonth(12);                 //13月を設定
    alert(d.toLocaleString());      //2005年1月18日 0:00:00
 
こういう場合、上のようにシリアル値を使うとよいです。
その他のメソッド
その他に、日時を文字にするメソッドと標準時からの時差を返すメソッドがあります。
    var d = new Date();
    alert(d.toString());
    alert(d.toLocaleString());
    alert(d.toGMTString());
    alert(d.getTimezoneOffset());
 
時差は分で返します。
あと、JavaScript1.3 JScript3から、
getFullYear setFullYear getMilliseconds setMilliseconds
というのも使えます。
Written 12/2/97
Modified 5/18/03
first, prev, next, exit