一、介紹
1、10位時間戳
2、13位時間戳
3、17位時間戳
4、時間戳轉換工具
二、13位時間戳的轉換
1、轉標準日期
2、轉格式化日期
三、10位時間戳的轉換
1、轉標準日期
2、轉格式化日期
四、17位時間戳的轉換
1、解析思路
2、解析過程
(1)統一單位
(2)差值計算
(3)截取時間
(4)轉標準日期
(5)格式化日期
3、完整代碼
4、新的問題?
一、介紹
1、10位時間戳
指的是Unix時間戳,它表示自1970年1月1日00:00:00 UTC(協調世界時) 以來的總秒數;
10位時間戳是一種常見的時間表示方式,因其簡單、易用、兼容性好,在軟件開發和網絡應用中被廣泛使用;
2、13位時間戳
指的是Unix時間戳,它表示自1970年1月1日00:00:00 UTC(協調世界時) 以來的總毫秒數;
13位時間戳是10位時間戳的擴展,將時間精度提高到了毫秒級,在需要高精度時間記錄和分析的場景中尤為有用;
3、17位時間戳
它表示自1601年1月1日00:00:00 GMT(格林威治時間) 以來的總微秒數;
17位的時間戳并不常見,但在Chrome、Edge,Firefox等瀏覽器的本地數據庫文件中,有關時間的字段都采用的是17位的時間戳;
4、時間戳轉換工具
無論是哪種格式的時間戳,都是用來表示一個時間點,但都不利于閱讀,因此需要將其轉換為有利于閱讀的標準日期格式;
時間戳轉換工具(10、13位時間戳)
時間戳轉換工具(17位時間戳)
二、13位時間戳的轉換
1、轉標準日期
- 13位時間戳表示自1970年1月1日00:00:00的總毫秒數;
- 使用JavaScript中的Date對象,可以將13位的時間戳轉換為標準日期;
- 只需在創建Date對象時傳入需要轉換的13位時間戳即可;
// 以 1719366631159 時間戳為例
new Date(1719366631159)
2、轉格式化日期
使用該方法可以將13位的時間戳轉換成 yyyy-MM-dd HH:mm:ss 格式的日期字符串;
// 13位時間戳的格式化,以1719366631059為例
console.log("格式化13位時間戳1719366631059:", formatTimeStamp(1719366631059));function formatTimeStamp(timeStamp) {let date = new Date(timeStamp);let year = date.getFullYear();let month = date.getMonth() + 1;let day = date.getDate();let hour = date.getHours();let minute = date.getMinutes();let second = date.getSeconds();month = month < 10 ? "0" + month : month;day = day < 10 ? "0" + day : day;hour = hour < 10 ? "0" + hour : hour;minute = minute < 10 ? "0" + minute : minute;second = second < 10 ? "0" + second : second;return `${year}-${month}-${day} ${hour}:${minute}:${second}`;;
}
三、10位時間戳的轉換
1、轉標準日期
- 10位時間戳表示自1970年1月1日00:00:00的總秒數;
- 只需給10位時間戳 * 1000 轉成13位時間戳,其他按照13位時間戳的處理方式就可以了;
// 以 1719366631 時間戳為例
new Date(1719366631 * 1000);
?
2、轉格式化日期
// 13位時間戳的格式化,以1719366631059為例
console.log("格式化13位時間戳1719366631059:", formatTimeStamp(1719366631059));// 10位時間戳的格式化,以1719366631為例
console.log("格式化10位時間戳1719366631:", formatTimeStamp(1719366631 * 1000));
注意:這里使用的是上面13位時間戳的轉換方法,只需注意傳入的參數即可;?
?
四、17位時間戳的轉換
17位的時間戳在解析上就比較麻煩了,JavaScript中的Date對象只能用來處理13位的時間戳,所以只能將17位時間戳的換成13位時間戳的表示規則,再進行解析(哪位大佬有更好的辦法,求賜教);
17位時間戳-在線轉換工具
從上述網站可以直接對17位的時間戳進行轉換,如下圖所示:
?輸入要轉換的時間戳之后,Unix 時間戳(10位)、以及標準時間(GMT + 8:00)都能得到;
?接下來,以【13363929430000000】這個時間戳為例,進行解析;
1、解析思路
- 將17位時間戳代表的微秒數轉換為毫秒數(進制1000),記為:timeStamp14;
- 計算1601年1月1日00:00:00的時間戳,記為:epoch_start;
- 計算1970年1月1日00:00:00的時間戳,記為:epoch_end;
- 計算差值 epoch_end -?epoch_start, 記為epoch;
- timeStamp14 - epoch,得到1970年1月1日00:00:00 以后的毫秒數, 記為ms;
- 使用new Date(),創建日期傳入ms,得到根據ms創建的日期對象,記為date;
- 再使用13位時間戳的格式化方法,對date進行格式化后得到格式化后的日期格式;
2、解析過程
(1)統一單位
- 17位時間戳表示總微秒數;
- 13位時間戳表示總毫秒數;
- 需要將17位時間戳 / 1000 轉換成毫秒數(微秒與毫秒之間的進制為1000);
// 17位時間戳表示的總微秒數
let timeStamp17 = 13363929430000000; // 轉換之后的總毫秒數
let timeStamp14 = Math.floor(timeStamp / 1000);
(2)差值計算
- 17位時間戳起始時間是1601年1月1日00:00:00(GMT) 以來的總微秒數;
- 13位時間戳起始時間是1970年1月1日00:00:00 (UTC) 以來的總毫秒數;
- 需要計算出1601年1月1日00:00:00?到?1970年1月1日00:00:00的總毫秒數;
// "1601-1-1 00:00:00"的毫秒數:-11644502743000
let epoch_start = new Date("1601-1-1 00:00:00:000").getTime(); // "1970-1-1 00:00:00"的毫秒數:-28800000
let epoch_end = new Date("1970-1-1 00:00:00:000").getTime(); let epoch = (epoch_end - epoch_start); // 相差 11644473943000 毫秒
注意:這里的時間是差了8小時的;
可以直接使用"1601-1-1 08:00:00:000"和"1970-1-1 08:00:00:000",計算差值結果都是一樣的;
(3)截取時間
截取17位時間戳從1970年1月1日00:00:00開始后的毫秒數;
let ms = timeStamp14 - epoch; // 減去差值后:1719374657000
這時17位時間戳就已經變成了從1970年1月1日00:00:00開始后的毫秒數(13位時間戳);?
(4)轉標準日期
將前面獲取到的毫秒數進行轉換;
let date = new Date(ms); // Wed Jun 26 2024 14:02:12 GMT+0800 (中國標準時間)
(5)格式化日期
使用13位時間戳的格式化方法;
formatTimeStamp(date); // 2024-06-27 10:31:27
3、完整代碼
// 13363929430000000 1719455830 2024年6月27日星期四上午10點37分 GMT+08:00// 格式化17位時間戳13363929430000000: 2024-06-27 10:31:27
console.log("格式化17位時間戳13363929430000000:", format17TimeStamp(13363929430000000)); function format17TimeStamp(timeStamp){let epoch_start = new Date("1601-1-1 00:00:00:000"); console.log(epoch_start.getTime()); // "1601-1-1 00:00:00"的毫秒數:-11644502743000let epoch_end = new Date("1970-1-1 00:00:00:000"); console.log(epoch_end.getTime()); // "1970-1-1 00:00:00"的毫秒數:-28800000let epoch = (epoch_end.getTime() - epoch_start.getTime()); console.log(epoch); // 相差epoch: 11644473943000 毫秒let timeStamp14 = Math.floor(timeStamp / 1000); // timeStamp14: 13363929430000console.log("timeStamp14:", timeStamp14);let ms = timeStamp14 - epoch; // ms: 1719455487000console.log("ms:", ms);let date = new Date(ms); // date: Thu Jun 27 2024 10:31:27 GMT+0800 (中國標準時間)console.log("date:", date);return formatTimeStamp(date); // 2024-06-27 10:31:27
}
4、新的問題?
很開心,終于解析出來了!!!
這就完了嗎? 當我以為已經成功的時候,突然看到
人家的是37分,我的是31分,這不是原地裂開了!!!!心都碎了一地~~~~~~~~~
.......................................................................................................................................................
找問題:年、月、日、小時都沒有問題,就差了5-6分鐘,難道是精度損失,也沒有啊,那這幾分鐘去哪了?
苦思冥想,頭發掉了又掉,為啥呢?
直到我做出了一個大膽的嘗試:
-------------------------------------------------------------------------------------------------------------------------------
使用13位的時間戳轉換工具,輸入0之后,跟預期結果一樣,是它的起始時間:
【1970-01-01 08:00:00】,
使用17位的時間戳轉換工具,輸入0之后,按道理應該是他的起始時間:
【1601年1月1日星期一早上8點00分 GMT+08:00】,但它不是!!!!!!!!!!!!!!
顯示 【GMT+08:05】,好像有那么點對上了,可能就是差在了這里!
可能是時區的問題,也可能是這個轉換工具的問題。。。。。(希望不是我的問題!!)
當然,這個問題我也是不太確定,沒有定論!
========================================================================
先記錄到這里吧,希望哪位走過路過的大佬指點指點,到底是為什么呢?
又要一晚上睡不著了~~~~~~~~~~~~~~~~~~~~~~~