みこむらめもむらむらむら

なんかHTML5とかJS勉強とかやりながらめもを綴るブログ

【JavaScript】日付/時刻データを操作する(Dateオブジェクト)

はいはいどんどん行きます!

Dateオブジェクトを生成する

Dateオブジェクトには他の文字列や配列などのように
リテラル表現は存在しない
オブジェクト生成には
必ずコンストラクタを経由する必要がある

はいはい出てきましたコンストラクタ

オブジェクトには、オブジェクトを初期化するために
オブジェクトと同名のメソッドが用意されている
この初期化メソッドのことをコンストラクタという

そうそうそうでした
この説明だけ読んでも訳が分からなかったのだけれど
なんかちょっとわかりそうな気がしてきたぞ

Dateオブジェクトのコンストラクタには以下4つがある

var d = new Date();
var d = new Date('2012/01/30');
var d = new Date(2012, 0, 30, 14, 29, 50, 500);
var d = new Date(1217862000000);

デフォルトのDateオブジェクトを生成する
Dateオブジェクトは
デフォルトで生成された時点でのシステム日付をセットする

var d = new Date('2012/01/30');

日付文字列をもとにDateオブジェクトを生成する
ここでは「2012/01/30」という形式で日付を指定しているが
他にも「Mon Jan 30 2012 14:15:30」のような
英文形式で指定することもできる

var d = new Date(2012, 0, 30, 14, 29, 50, 500);

年月日/時分秒/ミリ秒の形式で指定したい場合は
この構文を利用する
この場合時分秒、ミリ秒は省略可能
月の指定が1~12でなく0~11で行う点に注意

var d = new Date(1217862000000);

1970/01/01 00:00:00からの
経過ミリ秒(タイムスタンプ値)で指定する方法
タイムスタンプを取得する方法は後述する

状況に応じてつかいわけるべし、はい!

Dateオブジェクトで利用可能なメンバ

ローカル(取得)

  • getFullYear()
    • 年(4桁)
  • getMonth()
    • 月(0~11)
  • getDate()
    • 日(1~31)
  • getDay()
    • 曜日(0:日曜~6:土曜日)
  • getHours()
    • 時(0~23)
  • getMinutes()
    • 分(0~59)
  • getSeconds()
    • 秒(0~59)
  • getMilliseconds()
    • ミリ秒(0~999)
  • getTime()
    • 1970/01/01 00:00:00からの経過ミリ秒
  • getTimezoneOffset()
    • 協定世界時との時差
var dat = new Date();
document.writeln(dat);
//Mon Jan 30 2012 15:20:10 GMT+0900
document.writeln(dat.getFullYear());  //2012
document.writeln(dat.getMonth());  //0
document.writeln(dat.getDate());  //30
document.writeln(dat.getDay());  //1(月曜)
document.writeln(dat.getHours());  //15
document.writeln(dat.getMinutes());  //20
document.writeln(dat.getSeconds());  //10
document.writeln(dat.getMilliseconds());  //587
document.writeln(dat.getTime());  //1327904410587
document.writeln(dat.getTimezoneOffset());  //-540

ローカル(設定)

  • setFullYear(y)
    • 年(4桁)
  • setMonth(m)
    • 月(0~11)
  • setDate(d)
    • 日(1~31)
  • setHours(h)
    • 時(0~23)
  • setMinutes(m)
    • 分(0~59)
  • setSeconds(s)
    • 秒(0~59)
  • setMilliseconds(ms)
    • ミリ秒(0~999)
  • setTime(ts)
    • 1970/01/01 00:00:00からの経過ミリ秒
var dat = new Date();
document.writeln(dat);
//Mon Jan 30 2012 15:31:58 GMT+0900
dat.setFullYear(2010);
dat.setMonth(4);
dat.setDate(9);
dat.setHours(8);
dat.setMinutes(30);
dat.setSeconds(25);
dat.setMilliseconds(100);
document.writeln(dat);
//Sun May 09 2010 08:30:25 GMT+0900

協定時(取得)

  • getUTCFullYear()
    • 年(4桁)
  • getUTCMonth()
    • 月(0~11)
  • geUTCtDate()
    • 日(1~31)
  • getUTCDay()
    • 曜日(0:日曜~6:土曜日)
  • getUTCHours()
    • 時(0~23)
  • getUTCMinutes()
    • 分(0~59)
  • getUTCSeconds()
    • 秒(0~59)
  • getUTCMilliseconds()
    • ミリ秒(0~999)
var dat = new Date();
document.writeln(dat);
//Mon Jan 30 2012 15:36:51 GMT+0900
document.writeln(dat.getUTCFullYear());  //2012
document.writeln(dat.getUTCMonth());  //0
document.writeln(dat.getUTCDate());  //30
document.writeln(dat.getUTCDay());  //1(月曜)
document.writeln(dat.getUTCHours());  //6
document.writeln(dat.getUTCMinutes());  //36
document.writeln(dat.getUTCSeconds());  //51
document.writeln(dat.getUTCMilliseconds());  //129

協定時(設定)

  • setUTCFullYear(y)
    • 年(4桁)
  • setUTCMonth(m)
    • 月(0~11)
  • setUTCDate(d)
    • 日(1~31)
  • setUTCHours(h)
    • 時(0~23)
  • setUTCMinutes(m)
    • 分(0~59)
  • setUTCSeconds(s)
    • 秒(0~59)
  • setUTCMilliseconds(ms)
    • ミリ秒(0~999)

解析

  • parse(dat)
    • 日時文字列を解析し、1970/01/01 00:00:00からの経過ミリ秒を取得
    • 静的メソッド
  • UTC(y, m, d[,h [,mm [,s [,ms]]]])
    • 日付情報をもとに1970/01/01 00:00:00からの経過ミリ秒を取得(協定時)
    • 静的メソッド
document.writeln(Date.parse('1986/09/23'));
//527785200000
document.writeln(Date.UTC(1986, 9, 23));
//530409600000

文字列変換

  • toGMTSString()
  • toUTCString()
    • 世界協定時を文字列として取得
  • toLocaleString()
    • ローカル時を文字列として取得
  • toDateString()
    • 日付部分を文字列として取得
  • toTimeString()
    • 時刻部分を文字列として取得
  • toLocaleDateString()
    • 地域情報に従って、日付部分を文字列として取得
  • toLocaleTimeString()
    • 地域情報に従って、時刻部分を文字列として取得
  • toString()
    • 日時を文字列として取得




協定世界時とは国際的な協定で決められている公式時刻のこと
通常はグリニッジ標準時とほとんど同義だと思っておいて良い
(厳密には協定世界時は閏秒を加味している分だけ
グリニッジ標準時とは異なる)

日付/時刻データを加算/減算する

Dateオブジェクトでは、日付/時刻を
直接加算/減算するためのメソッドは用意されていない

このような計算を行うには
setXxxxxを利用して以下の手順で
個々の日付/時刻要素に加算/減算を行う必要がある

  1. getXxxxxメソッドで現在の日付/時刻要素を取得しておく
  2. 取得した値に加算/減算を行う
  3. さらにsetXxxxxメソッドで設定しなおす

以下具体例!

var dat = new Date(2010, 4, 15, 11, 40);
document.writeln(dat.toLocaleString());  //2010年5月15日 11:40:00
dat.setMonth(dat.getMonth() + 3);  //3ヶ月を加算
document.writeln(dat.toLocaleString());  //2010年8月15日 11:40:00
dat.setDate(dat.getDate() - 20);  //20日を減算
document.writeln(dat.toLocaleString());  //2010年7月26日 11:40:00

ふむふむ
特定の要素に対する加算/減算の結果が
有効範囲を超えてしまっても
正しい日付に自動的に換算してくれる、べんりー!

この性質をつかって
その月の最終日を求めることもできる、ほう

var dat = new Date(2010, 4, 15, 11, 40);
document.writeln(dat.toLocaleString());  //2010年5月15日 11:40:00
dat.setMonth(dat.getMonth() + 1);  //来月の‥
dat.setDate(0);  //0日目をセット
document.writeln(dat.toLocaleString());  //2010年5月31日 11:40:00

なるほど‥「来月の0日目」はDateオブジェクトでは
「今月の最終日」になるわけですね、ふむふむ

日付/時刻の差分を求める

日付/時刻の差を求めるような処理に関しても
Dateオブジェクトは直接機能していないため
以下のようなコードを記述する必要がある

var dat1 = new Date(2010, 4, 15);  //2010/05/15
var dat2 = new Date(2010, 5, 20);  //2010/06/20
var diff = (dat2.getTime() - dat1.getTime()) / (1000 * 60 * 60 *24);
document.writeln(diff + '日の差があります');
//36日の差があります

ここでは「2010/06/20」と「2010/05/15」との
日付差を計算している
日付差を求める場合にまず必要になるのが
2つの日付の経過ミリ秒である
経過ミリ秒を取得するのはgetTimeメソッドの役割
ここでは経過ミリ秒の差を求め
その値をもう一度日付に変換している
経過ミリ秒を日付に変換するのは以下公式できる

経過ミリ秒÷(1000ミリ秒×60秒×60分×24時間)

定型的な差分計算の例なので覚える必要あり
おぼえにくそうだ‥りょうかいしました‥




さてそろそろ疲れてきたぞ