跳至主要内容

[JS] Date Time Method 日期時間

常用

/**
* 取得當前時間
**/
Date.now() // 回傳當前的 timestamp(毫秒)
new Date() // 回傳目前時間的日期物件

/**
* 時間(文字)與時間戳記(timestamp)間轉換
**/
const dateObj = new Date(<timestamp>) // 輸入 timestamp(毫秒),回傳設定的時間物件
dateObj.getTime() // 輸入時間物件,回傳特定時間的 timestamp(毫秒)
Number(dateObj) // 一樣可以取得 timeStamp
+dateObj // 一樣可以取得 timeStamp
new Date(dateString)             //    輸入字串,回傳實例,取得設定時間的日期物件
new Date(year, month[, day[, hour[, minutes[, seconds[, milliseconds]]]]]);

dateObj.toISOString() // 將日期時間轉換成 ISO 8601 格式的字串回傳。
dateObj.toString() // 回傳字串,將日期物件轉成字串,Wed Jul 28 1993 14:39:07 GMT-0600 (PDT)
dateObj.toTimeString() // 回傳字串,將日期物件轉成字串,14:39:07 GMT-0600 (PDT)

dateObj.getFullYear()
dateObj.getMonth() // 回傳數值,取得該日的月份,月份 0 表示 1 月!
dateObj.getDate() // 回傳數值,取得該日為該月份的幾號
dateObj.getDay() // 回傳數值,取得該日為星期幾
dateObj.getSeconds() // 回傳數值,取得日期物件的秒資訊
dateObj.getMinutes() // 回傳數值,取得日期物件的分資訊分
dateObj.getHours() // 回傳數值,取得日期物件的小時資訊
dateObj.valueOf() // 回傳日期物件,和 getTime 效果一樣

dateObj.setDate(dayValue) // 回傳 timestamp,設定 dateObj 的日期,同時改變 dateObj
dateObj.setFullYear(dayValue)

常用方法

將取得的 timestamp 轉成可讀的時間

因為一般 timestamp 取得的是秒數,但在 JavaScript 中要帶入的是毫秒,所以要 new Date(timestamp * 1000)

let timestamp = 1513598707;
new Date(1513598707 * 1000); // 因為一般 timestamp 取得的是秒數,但要帶入的是毫秒,所以要乘 1000

// 或者
let date = new Date(timestamp * 1000);
dataValues = [
date.getFullYear(),
date.getMonth() + 1,
date.getDate(),
date.getHours(),
date.getMinutes(),
date.getSeconds(),
];
console.log(dataValues);

根據今天用來增減時間

/**
* setDate 的方法會回傳時間戳記,同時 theDay 這個時間物件的值會改變
**/

let theDay = new Date(); // 建立時間物件
let changeDay = 30; // 設定要往前或往後幾天
let timeStamp = theDay.setDate(theDay.getDate() + changeDay); // theDay.getDate() 是用來取得今天是幾號

console.log(theDay.toISOString()); // 把物件轉成字串

轉成 ISO 8601 的格式,並且捨去小數點

dateObj.toISOString().split('.')[0] + 'Z';

把秒數改成時分秒

let totalSeconds = 6384053;

let hours = Math.floor(totalSeconds / 3600); // Math.floor 無條件捨去
let mins = Math.floor((totalSeconds % 3600) / 60);
let seconds = (totalSeconds % 3600) % 60;

console.log(hours, mins, seconds);

多時區處理

  • UTC 指的是世界協調時間(Coordinated Universal Time)。
  • GTM 指格林威治標準時間(Greenwich Mean Time)。
  • GMT 和 UTC 在一般使用的情況下沒有差別,你要說台灣的時區是 UTC+8 或是 GMT+8 都可以。
  • **偏移(offset)**指的是某地區與 UTC 偏移的時間,例如 +08:00,表示該地區的時間比 UTC 快了 8 小時。
  • 夏日時間(Daylight Saving Time, DST)
/**
* 沒有寫時區的話,預設就會抓當地時區的時間
**/

new Date('2017-07-09 00:00:00'); // Sun Jul 09 2017 00:00:00 GMT+0800 (CST)
// toLocaleString(): 2017-7-9 00:00:00

new Date('2017-07-09 00:00:00 +0800'); // Sun Jul 09 2017 00:00:00 GMT+0800 (CST)
// toLocaleString(): 2017-7-9 00:00:00

// For FireFox
new Date('2017-07-09T00:00:00+0800'); // Sun Jul 09 2017 00:00:00 GMT+0800 (CST)
// toLocaleString(): 2017-7-9 00:00:00
/**
* 下面這三種都會得到一樣的時間
**/

// 有寫時區的話,會以給定時區的時間,回傳當地時區的時間
new Date('2017-07-09 00:00:00 +0000'); // Sun Jul 09 2017 08:00:00 GMT+0800 (CST)
// toLocaleString(): 2017-7-9 08:00:00

// 沒寫時間的話,會以 UTC(+0)的 00:00 為時間,回傳當地時區的時間
new Date('2017-07-09'); // Sun Jul 09 2017 08:00:00 GMT+0800 (CST)
// toLocaleString(): 2017-7-9 08:00:00

// 寫 UTC 或以 ISO 時間表示的話,就是 UTC(+0)的時間,回傳當地時間的時間
new Date('2017-07-09 00:00:00 UTC'); // Sun Jul 09 2017 08:00:00 GMT+0800 (CST)
// toLocaleString(): 2017-7-9 08:00:00

new Date('2017-07-09T00:00:00Z'); // Sun Jul 09 2017 08:00:00 GMT+0800 (CST)
// toLocaleString(): 2017-7-9 08:00:00

把時間寫入 db 前要先將時間轉成 UTC 時間(+0)

let localeTime = '2017-07-09 00:00:00'; // 給當地時區的時間
let localeTimeObj = new Date(localeTime);

localeTimeObj; // Sun Jul 09 2017 00:00:00 GMT+0800 (CST)
localeTimeObj.toUTCString(); // 轉成 UTC(+0)的時間,Sat, 08 Jul 2017 16:00:00 GMT

localeTimeObj.toString(); // String Sun Jul 09 2017 00:00:00 GMT+0800 (CST)
localeTimeObj.toLocaleString(); // 2017-7-9 00:00:00

從 db 拿回來的 UTC(+0)時間要轉回當地時間

let UTCTime = '2017-07-09T00:00:00Z'; // 從 DB 拿回來的 UTC/ISO 時間
let UTCTimeObj = new Date(UTCTime);

UTCTimeObj; // Sun Jul 09 2017 08:00:00 GMT+0800 (CST)
UTCTimeObj.toString(); // Sun Jul 09 2017 08:00:00 GMT+0800 (CST)
UTCTimeObj.toLocaleString(); // 轉成 UTC(+8)的時間,2017-7-9 08:00:00

格式化時間

參考

Date @ MDN