Dateオブジェクト

Dateオブジェクトが扱える範囲は、1970年1月1日の前後273,785年です。よって275755年まで扱えることになります。

オブジェクトの生成

new Date()

引数を指定しないと、現在の日時でDateオブジェクトが生成されます。

new Date( milliseconds )

1970/1/1 UTCからmillisecondsミリ秒経過した日時と解釈されます。

new Date( year, month, day [, hour, minute, second, millisecond] )
Date - JavaScript | MDN

month0が起点のため、1月ならば0、12月ならば11のように指定します。

newを省略すると、引数が無視され現在の日時が文字列で返されます。

文字列からの生成 (new Date())

Date.parse( datestring )
parse - JavaScript | MDN

文字列を解析し、ミリ秒で表された数値形式 (getTime()で返される値) で結果を返します。

new Date( datestring )

コンストラクタの引数に文字列を渡した場合、それを解析しDateオブジェクトを返します。ただしその文字列は、Date.parse()メソッドで解析できる形式である必要があります。

ブラウザによる相違

Date.parse()による解析の成否
規格 文字列 IE8 IE11 Firefox Chrome あなたの
ブラウザ
  '2008年5月1日 2:00:00' × × × × ?
  '2008/5/1 2:00:00' ?
  '2008/05/01 02:00:00' ?
  '2008/05/0102:00:00' × × ?
  '2008-5-1 2:00:00' × × × ?
ISO-8601 '20080501T020000+0900' × × × × ?
ISO-8601 拡張形式 '2008-05-01T02:00:00+09:00' × ?
RFC 3339
  '2008/5/1T2:00:00+0900' × × ?
  '2008/5/1 2:00:00+0900' × ?
  '2008/5/1 2:00:00 +0900' ?
RFC 822 'Thu, 1 May 08 02:00:00 +0900' × × × ?
RFC 1036
RFC 1123 'Thu, 1 May 2008 02:00:00 +0900' ?
RFC 2822
  'Thu May 1 02:00:00 +0900 2008' × × ?
  'Thu May 1 02:00:00 UTC+0900 2008' ?
  'Thu May 01 2008 02:00:00 GMT+0900' ?
  'Thu May 01 2008 02:00:00 GMT+0900 (Japan Standard Time)' ?
RFC 850 'Thursday, 01-May-08 02:00:00 JST' × × × × ?
'Wednesday, 30-Apr-08 17:00:00 GMT' × × × ?
△ … 解析には成功するが、誤った結果が返されます。

IE9やFirefoxなどは解析の失敗時に、'Invalid Date'とtoString()が表現するDateオブジェクトを返します。この特殊な値はisNaN()で判定できます。

文字列への変換 (to...String)

ブラウザによる相違

次のコードを複数のブラウザで実行し、その結果を表にまとめました。

var date = new Date( 'Thu, 01 May 2008 02:00:00' );

document.writeln( date.toString() );
document.writeln( date.toLocaleString() );
document.writeln( date.toUTCString() );

// Date
document.writeln( date.toDateString() );
document.writeln( date.toLocaleDateString() );

// Time
document.writeln( date.toTimeString() );
document.writeln( date.toLocaleTimeString() );
分類 メソッド IE6, IE7, IE8 Firefox 3 Chrome 4
日付&時刻 toString() Thu May 1 02:00:00 UTC+0900 2008 Thu May 01 2008 02:00:00 GMT+0900 Thu May 01 2008 02:00:00 GMT+0900 (Japan Standard Time)
toLocaleString() 2008年5月1日 2:00:00 Thu May 01 2008 02:00:00 GMT+0900 (Japan Standard Time)
toUTCString() Wed, 30 Apr 2008 17:00:00 UTC Wed, 30 Apr 2008 17:00:00 GMT
toGMTString()
日付 toDateString() Thu May 1 2008 Thu May 01 2008
toLocaleDateString() 2008年5月1日 Thursday, May 01, 2008
時刻 toTimeString() 02:00:00 UTC+0900 02:00:00 GMT+0900 02:00:00 GMT+0900 (Japan Standard Time)
toLocaleTimeString() 2:00:00 02:00:00

出力フォーマットはブラウザで異なるため、これを統一するには独自の関数で処理する必要があります。

toLocaleString()でoptions引数がサポートされるならば、それでフォーマットを指定できます。ブラウザの実装状況 - Date.prototype.toLocaleString() - JavaScript | MDN

// 出力例:2008/5/1 2:00:00
function toLocaleString( date )
{
    return [
        date.getFullYear(),
        date.getMonth() + 1,
        date.getDate()
        ].join( '/' ) + ' '
        + date.toLocaleTimeString();
}

時刻も独自に処理する場合には、

( '0' + date.getMinutes() ).slice( -2 )

のようにゼロパディングをすると書式が整います。

一方でprototypeプロパティを使用して、組み込みのメソッドを書き換える方法もあります。

Date.prototype.toLocaleString = function()
{
    return [
        this.getFullYear(),
        this.getMonth() + 1,
        this.getDate()
        ].join( '/' ) + ' '
        + this.toLocaleTimeString();
}

言語と地域による相違

date.toLocaleString([locales[, options]])
Date.prototype.toLocaleString() - JavaScript | MDN

localesなどの引数をサポートするのは、Internet Explorer 11以降です。ブラウザの実装状況 - Date.prototype.toLocaleString() - JavaScript | MDN

new Date().toLocaleString('ja-JP', {era:'long'});
  locales 出力例
日本語-日本 'ja-JP' ?
中国語-中国 'zh-CN' ?
韓国語-韓国 'ko-KR' ?
英語-米国 'en-US' ?
英語-英国 'en-GB' ?
ロシア語-ロシア 'ru-RU' ?
ヒンディー語-インド 'hi-IN' ?
アラビア語-サウジアラビア 'ar-SA' ?
アラビア語-エジプト 'ar-EG' ?

Unicode 拡張キー (Unicode extension keys)

言語コードに"u"を続ける形式で、langCode-u-ru-**ca-**のように記述します。

  有効な値
nu 番号方式 'arab', 'arabext', 'bali', 'beng', 'deva', 'fullwide', 'gujr', 'guru', 'hanidec', 'khmr', 'knda', 'laoo', 'latn', 'limb', 'mlym', 'mong', 'mymr', 'orya', 'tamldec', 'telu', 'thai', 'tibt'
ca カレンダー 'buddhist', 'chinese', 'coptic', 'ethioaa', 'ethiopic', 'gregory', 'hebrew', 'indian', 'islamic', 'islamicc', 'iso8601', 'japanese', 'persian', 'roc'
hc 時間周期 'h11', 'h12', 'h23', 'h24'
Intl.DateTimeFormat - JavaScript | MDN
locales 出力例 出力例 (era:'long')
'th-TH-u-nu-thai' ? ?
'en-GB-u-nu-thai' ? ?
'en-GB-u-nu-arab' ? ?
'en-GB-u-ca-islamic' ? ?
'en-GB-u-ca-japanese' ? ?
'ja-JP-u-ca-japanese' ? ?
元号

Internet ExplorerとEdgeは、day部分を含む形式では元号が出力されません。javascript - 和暦で年を表すjavascriptは? - スタック・オーバーフロー

options 出力例
{} ?
{era:'long'} ?
{era:'long',year:'numeric'} ?
{era:'long',year:'numeric',month:'numeric'} ?
{era:'long',year:'numeric',month:'numeric',day:'numeric'} ?

日時の取得 (get...)

分類 内容 メソッド 戻り値
日付 getFullYear() 2桁の省略形ではない、世紀を含めた数値
(たとえば1998年は、"98"ではなく"1998")
getMonth() 0 (1月) から11 (12月) まで
※0を起点として表されており、数値との対応に注意する
getDate() 1から31まで
曜日 getDay() 0 (日曜日) から6 (土曜日) まで
時刻 getHours() 0 (午前0時) から23 (午後11時) まで
getMinutes() 0から59まで
getSeconds() 0から59まで
ミリ秒 getMilliseconds() 0から999まで

これらのメソッド名をgetUTCXxのように「UTC」をつけた形式にすると、結果を世界時で取得できます。

var date = new Date( 0 );
date.toString();    // "Thu Jan 01 1970 09:00:00 GMT+0900"

date.getFullYear(); // 1970
date.getMonth();    // 0
date.getMonth();    // 1
date.getDay();      // 4

new String( '日月火水木金土' ).charAt( date.getDay() ); // "木"

内部的な時間

date.getTime()
Date.getTime - JavaScript | MDN

getTime()は、Dateオブジェクトの基準日時 (1970/1/1 0:00:00) との差をミリ秒で表します。これは2つのDateオブジェクトを比較したり、時間差の計算をするのに使えます。

Dateオブジェクトは、場合によってはgetTime()により暗黙的に数値に変換されます。たとえば、

date.getTime();

とする代わりに

+date;

としても同じ結果が返されます。このことから、2つの時間の差を求めるには

date1.getTime() - date2.getTime();

ではなく、

date1 - date2;

としても同じです。ただし数値に加算すると文字列に変換されるため、その点には注意が必要です。

var date = new Date( '2000/1/1' );

date.getTime(); //  946652400000
 -date;         // -946652400000
0-date;         // -946652400000

0+date;         // "0Sat Jan 01 2000 00:00:00 GMT+0900"

日時の操作

get...で取得した値に加減算し、set...で設定し直します。

// 日付を1日進める
date.setDate( date.getDate() + 1 );

// 時刻を1秒戻す
date.setSeconds( date.getSeconds() - 1 );
分類 内容 メソッド
日付 setFullYear()
setMonth()
setDate()
時刻 setHours()
setMinutes()
setSeconds()
ミリ秒 setMilliseconds()
※基本的にgetメソッドと対をなすように用意されています。

UNIX時間との相互変換

Dateオブジェクトは、内部的には1970年1月1日を基準とした時間で表されます。このことからUNIX時間と似通っていますが、Dateオブジェクトがミリ秒単位であることに対して、UNIX時間は秒単位で表されます。

UNIX時間からDateオブジェクトへの変換

var date = new Date( unixTimestamp * 1000 );

DataオブジェクトからUNIX時間への変換

var unixTimestamp = Math.round( date.getTime() / 1000 );

時間とUNIX時間の変換ツール

JavaScriptのドキュメントから検索