第20章 日付
目次
書籍を購入する
(広告です。ブロックしないでください。)

第20章 日付

JavaScriptのDateコンストラクターは、日付の解析、管理、表示を支援します。この章では、その仕組みについて説明します。

日付APIでは、UTC(協定世界時)という用語を使用します。ほとんどの場合、UTCはGMT(グリニッジ標準時)の同義語であり、ほぼ英国ロンドンのタイムゾーンを意味します。

Dateコンストラクター

Dateのコンストラクターを呼び出す方法は4つあります。

new Date(year, month, date?, hours?, minutes?, seconds?, milliseconds?)

指定されたデータから新しい日付を構築します。時間は現在のタイムゾーンを基準にして解釈されます。Date.UTC()は同様の機能を提供しますが、UTCを基準にします。パラメーターの範囲は次のとおりです。

  • year: 0 ≤ year ≤ 99 の場合、1900が加算されます。
  • month: 0~11(0は1月、1は2月など)
  • date: 1~31
  • hours: 0~23
  • minutes: 0~59
  • seconds: 0~59
  • milliseconds: 0~999

以下にいくつかの例を示します。

> new Date(2001, 1, 27, 14, 55)
Date {Tue Feb 27 2001 14:55:00 GMT+0100 (CET)}
> new Date(01, 1, 27, 14, 55)
Date {Wed Feb 27 1901 14:55:00 GMT+0100 (CET)}

ちなみに、JavaScriptは、0を1月、1を2月として解釈するという、Javaから受け継いだやや奇妙な慣習を持っています。

new Date(dateTimeStr)

これは日付時刻文字列であり、数値に変換され、それを使用してnew Date(number)が呼び出されます。日付時刻の書式では、日付時刻の書式について説明しています。 例:

> new Date('2004-08-29')
Date {Sun Aug 29 2004 02:00:00 GMT+0200 (CEST)}

不正な日付時刻文字列は、NaNnew Date(number)に渡されます。

new Date(timeValue)

1970年1月1日00:00:00 UTCからのミリ秒数で指定された日付を作成します。例えば

> new Date(0)
Date {Thu Jan 01 1970 01:00:00 GMT+0100 (CET)}

このコンストラクターの逆は、ミリ秒を返すgetTime()メソッドです。

> new Date(123).getTime()
123

NaNを引数として使用でき、これにより、特別なDateインスタンスである「無効な日付」が生成されます。

> var d = new Date(NaN);
> d.toString()
'Invalid Date'
> d.toJSON()
null
> d.getTime()
NaN
> d.getYear()
NaN
new Date()
現在の日付と時刻のオブジェクトを作成します。これはnew Date(Date.now())と同じように機能します。

Dateコンストラクターメソッド

コンストラクターDateには、以下のメソッドがあります。

Date.now()
現在の日付と時刻をミリ秒単位(1970年1月1日00:00:00 UTCからの)で返します。new Date().getTime()と同じ結果になります。
Date.parse(dateTimeString)

dateTimeStringを1970年1月1日00:00:00 UTCからのミリ秒数に変換します。日付時刻の書式では、dateTimeStringの書式について説明しています。結果は、new Date(number)を呼び出すために使用できます。以下にいくつかの例を示します。

> Date.parse('1970-01-01')
0
> Date.parse('1970-01-02')
86400000

文字列を解析できない場合、このメソッドはNaNを返します。

> Date.parse('abc')
NaN
Date.UTC(year, month, date?, hours?, minutes?, seconds?, milliseconds?)

指定されたデータを1970年1月1日00:00:00 UTCからのミリ秒数に変換します。引数が同じDateコンストラクターとは、次の2つの点で異なります。

  • 新しい日付オブジェクトではなく、数値を返します。
  • 引数をローカル時間ではなく、UTCとして解釈します。

Dateプロトタイプメソッド

このセクションでは、Date.prototypeのメソッドについて説明します。

時間単位のゲッターとセッター

時間単位のゲッターとセッターは、次のシグネチャで使用できます。

  • ローカル時間

    • Date.prototype.get«Unit»()は、ローカル時間に従ってUnitを返します。
    • Date.prototype.set«Unit»(number)は、ローカル時間に従ってUnitを設定します。
  • 協定世界時

    • Date.prototype.getUTC«Unit»()は、協定世界時に従ってUnitを返します。
    • Date.prototype.setUTC«Unit»(number)は、協定世界時に従ってUnitを設定します。

Unitは、次のいずれかの単語です。

  • FullYear:通常4桁
  • Month:月(0~11)
  • Date:日(1~31)
  • Day(ゲッターのみ):曜日(0~6)。0は日曜日
  • Hours:時間(0~23)
  • Minutes:分(0~59)
  • Seconds:秒(0~59)
  • Milliseconds:ミリ秒(0~999)

以下に例を示します。

> var d = new Date('1968-11-25');
Date {Mon Nov 25 1968 01:00:00 GMT+0100 (CET)}
> d.getDate()
25
> d.getDay()
1

さまざまなゲッターとセッター

次のメソッドを使用すると、1970年1月1日からのミリ秒単位で時間取得と設定などができます。

  • Date.prototype.getTime()は、1970年1月1日00:00:00 UTCからのミリ秒数を返します(「時間値:1970-01-01以降のミリ秒としての日付」を参照)。
  • Date.prototype.setTime(timeValue)は、1970年1月1日00:00:00 UTCからのミリ秒数で指定された日付を設定します(「時間値:1970-01-01以降のミリ秒としての日付」を参照)。
  • Date.prototype.valueOf()は、getTime()と同じです。このメソッドは、日付が数値に変換されるときに呼び出されます。
  • Date.prototype.getTimezoneOffset()は、ローカル時間とUTC時間の差を分単位で返します。

ユニットYearは非推奨になり、FullYearが推奨されています。

  • Date.prototype.getYear()は非推奨です。getFullYear()を使用してください。
  • Date.prototype.setYear(number)は非推奨です。setFullYear()を使用してください。

Dateを文字列に変換する

文字列への変換は、実装に大きく依存することに注意してください。以下の日付は、以下の例で出力を計算するために使用されます(この書籍の執筆時点で最も完全なサポートがあったFirefoxで)。

new Date(2001,9,30, 17,43,7, 856);
時間(人間が読める形式)
  • Date.prototype.toTimeString():

    17:43:07 GMT+0100 (CET)

    現在のタイムゾーンでの時間。

  • Date.prototype.toLocaleTimeString():

    17:43:07

    ロケール固有の形式での時間。このメソッドは、ECMAScript Internationalization API(「ECMAScript Internationalization API」を参照)によって提供され、それがないとあまり意味がありません。

日付(人間が読める形式)
  • Date.prototype.toDateString():

    Tue Oct 30 2001

    日付。

  • Date.prototype.toLocaleDateString():

    10/30/2001

    ロケール固有の形式での日付。このメソッドは、ECMAScript Internationalization API(「ECMAScript Internationalization API」を参照)によって提供され、それがないとあまり意味がありません。

日付と時刻(人間が読める形式)
  • Date.prototype.toString():

    Tue Oct 30 2001 17:43:07 GMT+0100 (CET)

    現在のタイムゾーンでの日付と時刻。ミリ秒がない(つまり、秒が満了している)Dateインスタンスの場合、次の式がtrueになります。

    Date.parse(d.toString()) === d.valueOf()
  • Date.prototype.toLocaleString():

    Tue Oct 30 17:43:07 2001

    ロケール固有の形式での日付と時刻。このメソッドは、ECMAScript Internationalization API(「ECMAScript Internationalization API」を参照)によって提供され、それがないとあまり意味がありません。

  • Date.prototype.toUTCString():

    Tue, 30 Oct 2001 16:43:07 GMT

    UTCでの日付と時刻。

  • Date.prototype.toGMTString():

    非推奨です。toUTCString()を使用してください。

日付と時刻(機械が読める形式)
  • Date.prototype.toISOString():

    2001-10-30T16:43:07.856Z

    すべての内部プロパティが、返される文字列に表示されます。書式は、「日付時刻の書式」に従っています。タイムゾーンは常にZです。

  • Date.prototype.toJSON():

    このメソッドは内部でtoISOString()を呼び出します。日付オブジェクトをJSON文字列に変換するために、JSON.stringify()(「JSON.stringify(value, replacer?, space?)」を参照)によって使用されます。

日付時刻の書式

このセクションでは、時刻のポイントを文字列として表すための形式について説明します。日付のみを示す方法、時刻を含める方法、タイムゾーンを省略する方法、タイムゾーンを指定する方法など、さまざまな方法があります。日付時刻の形式のサポートにおいて、ECMAScript 5は標準のISO 8601拡張形式に厳密に従っています。JavaScriptエンジンはECMAScript仕様を比較的完全に実装していますが、まだいくつかのバリエーションがあるため、注意が必要です。

最長の時刻形式は

YYYY-MM-DDTHH:mm:ss.sssZ

各部分は、日付時刻データのいくつかの10進数を表します。たとえば、YYYYは、形式が4桁の年で始まることを意味します。次のサブセクションでは、各部分の意味について説明します。形式は次のメソッドに関連します。

  • Date.parse()は形式を解析できます。
  • new Date()は形式を解析できます。
  • Date.prototype.toISOString()は、前述の「完全な」形式で文字列を作成します。

    > new Date().toISOString()
    '2014-09-12T23:05:07.414Z'

日付形式(時間なし)

次の日付形式を使用できます。

YYYY-MM-DD
YYYY-MM
YYYY

次の部分が含まれます。

  • YYYYは、年(グレゴリオ暦)を指します。
  • MMは、月を指します(01〜12)。
  • DDは、日を指します(01〜31)。

以下に例を示します。

> new Date('2001-02-22')
Date {Thu Feb 22 2001 01:00:00 GMT+0100 (CET)}

時刻形式(日付なし)

次の時刻形式を使用できます。ご覧のとおり、タイムゾーン情報Zはオプションです。

THH:mm:ss.sss
THH:mm:ss.sssZ

THH:mm:ss
THH:mm:ssZ

THH:mm
THH:mmZ

次の部分が含まれます。

  • Tは、形式の時刻部分のプレフィックスです(リテラルT、数字ではありません)。
  • HHは、時間を指します(00〜23)。HHの値として24を使用できます(翌日の00時を指します)が、その場合は残りのすべての部分が0でなければなりません。
  • mmは、分を指します(00〜59)。
  • ssは、秒を指します(00〜59)。
  • sssは、ミリ秒を指します(000〜999)。
  • Zは、次の2つのいずれかのタイムゾーンを指します。

    • UTCの場合は「Z
    • +」または「-」の後に時間「hh:mm

一部のJavaScriptエンジンでは、時刻のみを指定できます(日付が必要なものもあります)。

> new Date('T13:17')
Date {Thu Jan 01 1970 13:17:00 GMT+0100 (CET)}

日付時刻の書式

日付形式と時刻形式を組み合わせることもできます。日付時刻形式では、日付または日付と時刻(一部のエンジンでは、時刻のみ)を使用できます。例:

> new Date('2001-02-22T13:17')
Date {Thu Feb 22 2001 13:17:00 GMT+0100 (CET)}

時間値:1970-01-01以降のミリ秒としての日付

日付APIがtimeと呼ぶものは、ECMAScript仕様では時間値と呼ばれています。これは、1970年1月1日00:00:00 UTCからのミリ秒数として日付をエンコードするプリミティブな数値です。各日付オブジェクトは、内部プロパティ[[PrimitiveValue]]に時間値として状態を格納します(ラッパーコンストラクターBooleanNumber、およびStringのインスタンスがラップされたプリミティブ値を格納するために使用するプロパティと同じです)。

警告

時間値では、うるう秒は無視されます。

次のメソッドは時間値を使用します。

  • new Date(timeValue)は、時間値を使用して日付を作成します。
  • Date.parse(dateTimeString)は、日付時刻文字列を含む文字列を解析し、時間値を返します。
  • Date.now()は、現在の日付時刻を時間値として返します。
  • Date.UTC(year, month, date?, hours?, minutes?, seconds?, milliseconds?)は、パラメーターをUTCを基準に解釈し、時間値を返します。
  • Date.prototype.getTime()は、レシーバーに格納されている時間値を返します。
  • Date.prototype.setTime(timeValue) は、指定された時間値に基づいて日付を変更します。
  • Date.prototype.valueOf() は、レシーバーに格納されている時間値を返します。このメソッドは、次のサブセクションで説明するように、日付がどのようにプリミティブに変換されるかを決定します。

JavaScript の整数範囲 (53 ビットと符号) は十分に大きく、1970 年の約 285,616 年前から約 285,616 年後までを表す時間間隔を表すことができます。

以下に、日付を時間値に変換するいくつかの例を示します。

> new Date('1970-01-01').getTime()
0
> new Date('1970-01-02').getTime()
86400000
> new Date('1960-01-02').getTime()
-315532800000

Date コンストラクターを使用すると、時間値を日付に変換できます。

> new Date(0)
Date {Thu Jan 01 1970 01:00:00 GMT+0100 (CET)}
> new Date(24 * 60 * 60 * 1000)  // 1 day in ms
Date {Fri Jan 02 1970 01:00:00 GMT+0100 (CET)}
> new Date(-315532800000)
Date {Sat Jan 02 1960 01:00:00 GMT+0100 (CET)}

日付を数値に変換する

日付は、時間値を返す Date.prototype.valueOf() を介して数値に変換されます。 これにより、日付を比較できます。

> new Date('1980-05-21') > new Date('1980-05-20')
true

算術演算を実行することもできますが、うるう秒は無視されることに注意してください。

> new Date('1980-05-21') - new Date('1980-05-20')
86400000

警告

プラス演算子 (+) を使用して日付を別の日付または数値に追加すると、文字列になります。これは、プリミティブへの変換のデフォルトが日付を文字列に変換するためです(プラス演算子の動作については、プラス演算子 (+) を参照してください)。

> new Date('2024-10-03') + 86400000
'Thu Oct 03 2024 02:00:00 GMT+0200 (CEST)86400000'
> new Date(Number(new Date('2024-10-03')) + 86400000)
Fri Oct 04 2024 02:00:00 GMT+0200 (CEST)

次へ: 21. Math