Skip to content

Date 時間觀念與處理

DANGER

在任何瀏覽器,使用操作 Date 物件,一律都會是以 本地時間 為顯示。

常見時間格式

Timestamp 時間戳

從 UTC+0 時區的 1970 年 1 月 1 號 0 時 0 分 0 秒開始,總共過了多少 毫秒。

  • new Date().getTime()
  • Date.now()
js
new Date().getTime() 
// 1619577479460 timestamp

Date.now() // 1638083670874 timestamp

console.log(new Date().getTime() === Date.now()) // true

TIP

  • timestamp 本身是沒有時區觀念。 (UTC+0)
  • 毫秒 為單位

TIP

💡 如果你發現程式碼中有些地方需要除以 1000 或是乘以 1000,就很有可能是在做秒跟毫秒的轉換。

ISO 8601 🔗

當日期用數字表示時,它可以有不同的方式解釋。比如,01/05/12 or January 5, 2012 or May 1, 2012 這都代表同一個時間,在商業環境中,它可能會產生錯誤的日期判讀,當日期不明確時,購買機票可能會非常困難。

所以 ISO 8601 透過國際的認證,來明確定義格式來解決這個不確定性:

格式: YYYY-MM-DDTHH:mm:ss.sssZ

bash
2012-09-27 #YYYY-MM-DD

表示2012年9月27日

2004-05-03T17:30:08+08:00

表示東八區 (UTC/GMT +8) 時間2004年5月3日下午5點30分8秒

TIP

是目前最主流的表示日期的規範格式,也是最推薦的日期格式。

注意

在跨瀏覽器使用 Date 物件解析日期字串, IOS 8601 也是最保險的方式,不會出現不同瀏覽器解析差異的問題。

js
let now = new Date('2021-11-28')

時間操作

本地時間 new Date()

js
new Date()
// Wed Apr 28 2021 11:29:24 GMT+0800 (台北標準時間)
  • 取得 timestamp 時間 .getTime()

    jsx
    new Date().getTime()
    // 1619580969515
    
  • 取得 ISO 8610 時間 .toISOString()

    js
    new Date().toISOString()
    // "2021-04-28T03:40:20.643Z"
    

解析時間 new Date( timestamp || iso8610) 🔗

js
new Date(1619580969515)
// Wed Apr 28 2021 11:36:09 GMT+0800 (台北標準時間)

new Date("2021-04-28T03:40:20.643Z")
// Wed Apr 28 2021 11:40:20 GMT+0800 (台北標準時間)

時間處理

取值操作回傳備註
西元年.getFullYear()2021
月份.getMonth()(0-11)0 :一月 ~ 11:十二月
日期.getDate()(1-31)
星期.getDay()(0-6)0代表星期日,1代表星期一
小時.getHours()(0-23)
分鐘.getMinutes()(0-59)
秒數.getSeconds()(0-59)

時區

日期為是以 本地 時間為主!! 在不同的電腦執行,都可能產生不同的時區!!

無論是 dayjs 或是 moment 也都一樣,如果沒有在 format 之前特別指定時區,format 出來的結果都會依照使用者當前的時區。所以同一段程式碼,在不同使用者的電腦可能會有不同的輸出。

TIP

同一段時間代碼,在不同的電腦執行,都可能產生不同的時區輸出

注意

但是大部分情形下會建議的做法都是由 前端 自行決定要顯示成哪個時區的時間,而不是由後端給的 date time 來決定。

解決方式

dayjs

js
dayjs('2020-02-02T13:00:00+03:00')
  .tz('Asia/Tokyo')
  .format('HH:mm:ss')

Reference