Date
在 JavaScript 中,Date 是一個內建的物件,用來處理日期和時間。 Date 物件是基於世界標準時間(UTC) 1970 年 1 月 1 日開始的毫秒數值(64 位浮點數)來儲存時間,不會受到 2038 年問題影響。
建立 Date 物件
new Date() 是 JavaScript 中用來建立 Date 物件的構造函數。
- 無參數
const now = new Date();
console.log(now); // Tue Aug 27 2024 23:21:17 GMT+0800 (台北標準時間)
- 時間戳 傳遞一個表示從 Unix 紀元(1970 年 1 月 1 日)起的毫秒數來創建 Date 物件。例如,1693123456000 毫秒對應於具體的日期和時間。
const timestamp = 1693123456000;
const date = new Date(timestamp);
console.log(date); // Sun Aug 27 2023 16:04:16 GMT+0800 (台北標準時間)
- 日期字串
傳遞一個日期字串來創建 Date 物件。這個字串應該要能被
Date.parse()方法解析(符合 IETF-compliant RFC 2822 timestamps 及 ISO8601 格式要求,例如:
注意
由於各家瀏覽器有所不同且具有差異性,因此非常不鼓勵使用 new Date() 或 Date.parse() 來解析時間日期字串。
const dateStr = "2024-08-27T16:04:16.000Z";
const date = new Date(dateStr);
console.log(date); // Sun Aug 27 2023 16:04:16 GMT+0800 (台北標準時間)
- 年、月、日、時、分、秒、毫秒
console.log(new Date(2024, 7, 27, 12, 34, 56, 789)); // Sun Jul 27 2024 12:34:56 GMT+0800 (台北標準時間)
console.log(new Date(2024, 7)); // Mon Jul 01 2024 00:00:00 GMT+0800 (台北標準時間)
console.log(new Date(2024)); // Mon Jan 01 2024 00:00:00 GMT+0800 (台北標準時間)
取得時間單位
timestamp
Date 物件的 getTime() 方法可以取得從 Unix 紀元(1970 年 1 月 1 日)起的毫秒數。
const now = new Date();
console.log(now.getTime()); // 1693123456000
// 或是使用 Date.now() 取得目前時間的 timestamp
console.log(Date.now()); // 1693123456000
年、月、日、星期、時、分、秒、毫秒
在 JavaScript 種,有兩種方法可以取得 Date 物件的時間單位:
get開頭的方法,例如getFullYear()、getMonth()、getDate()、getHours()、getMinutes()、getSeconds()、getMilliseconds()。getUTC開頭的方法,例如getUTCFullYear()、getUTCMonth()、getUTCDate()、getUTCHours()、getUTCMinutes()、getUTCSeconds()、getUTCMilliseconds()。
兩種的差異在於 get 開頭的方法會根據當地時區取得時間,而 getUTC 開頭的方法則是取得** UTC 時間**。
const now = new Date("2024-08-27T00:00:00.000+08:00");
console.log(now.getFullYear()); // 2024
console.log(now.getMonth()); // 7,因為月份是從 0 開始計算
console.log(now.getDate()); // 27
console.log(now.getDay()); // 2,星期二
console.log(now.getHours()); // 0
console.log(now.getMinutes()); // 0
console.log(now.getSeconds()); // 0
console.log(now.getMilliseconds()); // 0
console.log(now.getUTCFullYear()); // 2024
console.log(now.getUTCMonth()); // 7
console.log(now.getUTCDate()); // 26,因為 UTC 時間比台灣時間早 8 小時,所以日期會比台灣時間少一天
console.log(now.getUTCDay()); // 1,星期一
console.log(now.getUTCHours()); // 16
console.log(now.getUTCMinutes()); // 0
console.log(now.getUTCSeconds()); // 0
console.log(now.getUTCMilliseconds()); // 0
時區
getTimezoneOffset() 是基於你現在執行程式的電腦的當地時區來計算。
const now = new Date("2024-08-27T15:21:17.000Z");
console.log(now.getTimezoneOffset()); // -480,因為台灣的時區是 UTC+8,所以差距是 -8 小時,也就是 -480 分鐘
const date1 = new Date("August 19, 1975 23:15:30 UTC+07:00");
const date2 = new Date("August 19, 1975 23:15:30 UTC-02:00");
// getTimezoneOffset() 會將 時區轉換為 UTC 時區後再計算差距,因此兩個日期的時區不同,但 getTimezoneOffset() 的結果相同
console.log(date1.getTimezoneOffset() === date2.getTimezoneOffset()); // true
字串轉換
在 JavaScript 中,有多種方法可以將 Date 物件轉換為字串:
toString():將Date物件轉換為當地時區的日期和時 間字串。
const now = new Date("2024-08-27T15:21:17.000Z");
console.log(now.toString()); // Sun Aug 27 2024 23:21:17 GMT+0800 (台北標準時間)
toUTCString():將 Date 物件轉換為 UTC 時區的日期和時間字串。
const now = new Date("2024-08-27T15:21:17.000Z");
console.log(now.toUTCString()); // Sun, 27 Aug 2024 15:21:17 GMT
toISOString():將 Date 物件轉換為 ISO 8601 格式的字串。
const now = new Date("2024-08-27T15:21:17.000Z");
console.log(now.toISOString()); // 2024-08-27T15:21:17.000Z
toDateString():將 Date 物件的日期部分轉換為字串。
const now = new Date("2024-08-27T15:21:17.000Z");
console.log(now.toDateString()); // Sun Aug 27 2024
toTimeString():將 Date 物件的時間部分轉換為字串。
const now = new Date("2024-08-27T15:21:17.000Z");
console.log(now.toTimeString()); // 23:21:17 GMT+0800 (台北標準時間)
toLocaleString():將 Date 物件轉換為當地時區的日期和時間字串,並根據當地化設定格式化。
const now = new Date("2024-08-27T15:21:17.000Z");
console.log(now.toLocaleString()); // 2024/8/27 下午11:21:17
toLocaleDateString():將 Date 物件的日期部分轉換為字串,並根據當地化設定格式化。
const now = new Date("2024-08-27T15:21:17.000Z");
console.log(now.toLocaleDateString()); // 2024/8/27
toLocaleTimeString():將 Date 物件的時間部分轉換為字串,並根據當地化設定格式化。
const now = new Date("2024-08-27T15:21:17.000Z");
console.log(now.toLocaleTimeString()); // 下午11:21:17