第 20 章 日期
目錄
購買書籍
(廣告,請勿封鎖。)

第 20 章 日期

JavaScript 的 Date 建構函式有助於剖析、管理和顯示日期。本章說明其運作方式。

日期 API 使用術語 UTC(協調世界時)。對於大多數目的,UTC 是 GMT(格林威治標準時間)的同義詞,大致表示英國倫敦的時區。

日期建構函式

有四種呼叫 Date 建構函式的方法:

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 繼承了 Java 稍嫌奇怪的慣例,將 0 詮釋為 1 月,1 為 2 月,以此類推。

new Date(dateTimeStr)

這是一個日期時間字串,會轉換成數字,然後呼叫 new Date(number)日期時間格式 說明了日期時間格式。例如:

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

不合法日期時間字串會導致 NaN 傳遞給 new 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.now()
傳回自 1970 年 1 月 1 日 00:00:00 UTC 以來經過的毫秒數(自 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 建構函式有兩種不同之處:

  • 它傳回數字,而非新的日期物件。
  • 它將引數視為 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:通常為四位數字
  • 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 日以來的毫秒數,以及更多:

單位 Year 已棄用,建議使用 FullYear

  • Date.prototype.getYear() 已棄用,請改用 getFullYear()
  • Date.prototype.setYear(number) 已棄用,請改用 setFullYear()

將日期轉換為字串

請注意 將日期轉換為字串在不同的實作中會產生很大的差異。以下日期用於計算以下範例中的輸出(在撰寫本書時,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 國際化 API 提供(請參閱 ECMAScript 國際化 API),若沒有此 API,此方法將沒有太大的意義。

日期(人類可讀)
  • Date.prototype.toDateString():

    Tue Oct 30 2001

    日期。

  • Date.prototype.toLocaleDateString():

    10/30/2001

    日期,使用特定地區的格式。此方法由 ECMAScript 國際化 API 提供(請參閱 ECMAScript 國際化 API),若沒有此 API,此方法將沒有太大的意義。

日期和時間(人類可讀)
  • Date.prototype.toString():

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

    日期和時間,使用目前時區。對於任何沒有毫秒數的 Date 執行個體(也就是秒數為整數),以下表達式為真

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

    Tue Oct 30 17:43:07 2001

    日期和時間,使用特定地區的格式。此方法由 ECMAScript 國際化 API 提供(請參閱 ECMAScript 國際化 API),若沒有此 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.stringify()(請參閱 JSON.stringify(value, replacer?, space?))使用,以將日期物件轉換為 JSON 字串。

日期時間格式

區段說明表示時間點為字串的格式。有許多方法可以做到這一點:僅指出日期、包括一天中的時間、省略時區、指定時區,等等。ECMAScript 5 在支援日期時間格式時,緊密遵循 ISO 8601 延伸格式標準。JavaScript 引擎幾乎完全實作 ECMAScript 規格,但仍有一些差異,因此您必須保持警覺。

最長的日期時間格式為

YYYY-MM-DDTHH:mm:ss.sssZ

每個部分代表日期時間資料的幾個十進位數位。例如,YYYY 表示格式從四位數年份開始。下列小節說明每個部分的意義。格式與下列方法相關

  • 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。您可以使用 24 作為 HH 的值(指的是隔天 00 小時),但接著所有剩餘的部分都必須為 0。
  • mm 指的是分鐘,從 00 到 59。
  • ss 指的是秒,從 00 到 59。
  • sss 指的是毫秒,從 000 到 999。
  • Z 指時區,下列兩種之一

    • Z” 代表 UTC
    • +” 或 “-” 後接時間 “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]] 內部屬性中,作為時間值(與包裝建構函式 BooleanNumberString 的執行個體用來儲存其包裝的原始值相同的屬性)。

警告

時間值中會忽略閏秒。

下列方法適用於時間值

  • 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 年開始,到 1970 年後約 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. 數學