獲取JavaScript當(dāng)前時(shí)間戳的方法有:1.date.now(),2.new date().gettime(),3.new date().valueof(),4.+new date()。其中date.now()最推薦,兼容性好且簡潔高效;其他方法雖語法不同但結(jié)果一致。時(shí)間戳轉(zhuǎn)換為可讀日期需借助date對象,通過getfullyear、getmonth等方法獲取年月日時(shí)分秒,或使用tolocaledatestring等格式化方法,也可借助第三方庫如day.JS。時(shí)間戳用途廣泛,包括生成唯一id、緩存控制、性能測試、數(shù)據(jù)排序、事件記錄和數(shù)據(jù)庫操作。時(shí)間戳通常為毫秒級(jí),若需秒級(jí),可通過除以1000并取整獲得,但會(huì)丟失毫秒精度,應(yīng)根據(jù)實(shí)際需求選擇。
獲取JavaScript當(dāng)前時(shí)間戳,簡單來說,就是拿到一個(gè)數(shù)字,代表從1970年1月1日00:00:00 UTC到現(xiàn)在的毫秒數(shù)。這在很多場景下都非常有用,比如生成唯一ID、緩存控制、性能測試等等。
解決方案
-
Date.now() (推薦)
這是獲取當(dāng)前時(shí)間戳最簡潔高效的方式,直接返回自 Epoch 以來的毫秒數(shù)。
const timestamp = Date.now(); console.log(timestamp); // 例如:1678886400000
兼容性非常好,除了IE8及更早版本,現(xiàn)代瀏覽器都支持。
-
new Date().getTime()
創(chuàng)建一個(gè)新的Date對象,然后調(diào)用getTime()方法,同樣返回毫秒數(shù)。
const timestamp = new Date().getTime(); console.log(timestamp); // 例如:1678886400000
這種方式也很常用,兼容性也很好。
-
new Date().valueOf()
valueOf()方法返回Date對象的原始值,即自 Epoch 以來的毫秒數(shù)。
const timestamp = new Date().valueOf(); console.log(timestamp); // 例如:1678886400000
效果和getTime()一樣,但稍微不那么直觀。
-
+new Date()
利用一元加號(hào)運(yùn)算符,將Date對象轉(zhuǎn)換為數(shù)字,結(jié)果也是毫秒數(shù)。
const timestamp = +new Date(); console.log(timestamp); // 例如:1678886400000
這是一種比較簡潔的寫法,但可讀性可能稍差。
總的來說,Date.now()是最推薦的方式,簡潔高效,兼容性好。其他幾種方式本質(zhì)上都是殊途同歸,只是語法上的差異。
如何將時(shí)間戳轉(zhuǎn)換為日期格式?
時(shí)間戳只是一個(gè)數(shù)字,如果想把它變成人類可讀的日期格式,需要使用Date對象。
const timestamp = Date.now(); const date = new Date(timestamp); const year = date.getFullYear(); const month = date.getMonth() + 1; // 月份從0開始,所以要加1 const day = date.getDate(); const hours = date.getHours(); const minutes = date.getMinutes(); const seconds = date.getSeconds(); console.log(`${year}-${month}-${day} ${hours}:${minutes}:${seconds}`); // 例如:2023-03-15 16:00:00
當(dāng)然,也可以使用toLocaleDateString()、toLocaleTimeString()等方法,根據(jù)不同的區(qū)域設(shè)置格式化日期和時(shí)間。還可以使用一些流行的日期處理庫,如Moment.js(雖然已停止維護(hù),但仍然廣泛使用)或Day.js,它們提供了更豐富的日期格式化功能。
為什么需要時(shí)間戳?
時(shí)間戳在很多場景下都非常有用。
- 生成唯一ID: 可以將時(shí)間戳作為ID的一部分,增加唯一性。
- 緩存控制: 可以利用時(shí)間戳來判斷緩存是否過期。比如,服務(wù)器返回?cái)?shù)據(jù)時(shí),可以帶上一個(gè)時(shí)間戳,客戶端在下次請求時(shí),比較當(dāng)前時(shí)間戳和服務(wù)器返回的時(shí)間戳,如果超過一定時(shí)間,就重新請求數(shù)據(jù)。
- 性能測試: 可以記錄代碼執(zhí)行前后的時(shí)間戳,計(jì)算代碼的執(zhí)行時(shí)間。
- 數(shù)據(jù)排序: 時(shí)間戳是數(shù)字,方便進(jìn)行排序。
- 事件記錄: 記錄事件發(fā)生的時(shí)間。
- 數(shù)據(jù)庫操作: 很多數(shù)據(jù)庫都支持時(shí)間戳類型,方便存儲(chǔ)和查詢時(shí)間數(shù)據(jù)。
時(shí)間戳精度問題:毫秒級(jí) vs 秒級(jí)?
通常我們獲取的是毫秒級(jí)時(shí)間戳,但有些情況下,可能只需要秒級(jí)時(shí)間戳。
- 毫秒級(jí): 精確到毫秒,適合需要高精度時(shí)間記錄的場景。
- 秒級(jí): 將毫秒級(jí)時(shí)間戳除以1000,并向下取整即可得到秒級(jí)時(shí)間戳。
const millisecondTimestamp = Date.now(); const secondTimestamp = Math.floor(millisecondTimestamp / 1000); console.log(millisecondTimestamp); // 例如:1678886400000 console.log(secondTimestamp); // 例如:1678886400
需要注意的是,秒級(jí)時(shí)間戳?xí)G失毫秒信息,所以在選擇時(shí)間戳精度時(shí),要根據(jù)實(shí)際需求進(jìn)行權(quán)衡。