摘要:經過一步步后發現問題在此客戶時區為美國東部時區夏令時明明寫的號,為什么生成的對象是號的因為把它解析為,時區為。美國東部時區是減小時的,于是就變成了前一天。可以傳入一個日期字符串來生成對象的,官方規定日期字符串需要符合或者的格式。
TL;DR
new Date 和 Date.parse 在格式化某些日期字符串的時候,時區具有不確定性,最好用 moment.js 這類工具去處理。
不確定的日期字符串事情的起源是客戶跟我說網頁上的某個日期總是比實際日期少一天。經過一步步 debug 后發現問題在此:
js// 客戶時區為美國東部時區夏令時 new Date("2015-03-31") // Mon Mar 30 2015 20:00:00 GMT-0400 (EDT)
明明寫的 31 號,為什么生成的對象是 30 號的?因為 new Date 把它解析為 2015-03-31 00:00:00 ,時區為 UTC 。美國東部時區是減 4 小時的,于是就變成了前一天 20:00:00 。
那么 new Date 傳入的時間字符串有沒有規律可循呢?
混亂的規律new Date 和 Date.parse 使用的是同樣的解析規律,只是一個返回 Date object 另一個返回毫秒數。為了方便查看結果,以下例子只用 new Date 。但請記住它們遵循一樣的規律。
new Date 可以傳入一個日期字符串來生成對象的,官方規定日期字符串需要符合 RFC2822 或者 ISO8601 的格式。拿上面的日期舉個例子,前者可以寫成 "Mar 31 2015" 后者可以寫成 "2015-03-31" 。
如果日期字符串不符合這兩種標準,new Date 對結果概不負責……
不過就算符合標準了,結果還是有點不同的。看幾個例子:
jsnew Date("Mar 31 2015") // Tue Mar 31 2015 00:00:00 GMT-0400 (EDT) new Date("2015-03-31") // Mon Mar 30 2015 20:00:00 GMT-0400 (EDT)
RFC2822 的格式如果不帶時區,new Date 會當做本地時區處理,而 ISO8601 格式則會當做 UTC 時區處理。
是有點繞人,但只要記住這個規律不就完了嗎?騷年你太天真了…… 因為 ES6 草案為了簡化這種情況,規定所有不帶時區的字符串都默認為本地時區。注意這是草案,所以結果你懂的。
解決方案一種解決方案是每次格式化日期都嚴格指定時區,以防止各種幺蛾子情況出現,比如:
jsnew Date("2015-03-31T00:00:00-04:00") // Tue Mar 31 2015 00:00:00 GMT-0400 (EDT)
不過鑒于人都是懶惰的,這種情況交給工具做更靠譜,比如 moment.js 。
jsmoment("2015-03-31").toDate()參考鏈接
Date.parse() - JavaScript | MDN
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/85605.html
摘要:對象對象實例表示單個時間點盡管名為它同樣被用來處理時間。在內部日期表示自年月日起到現在的毫秒數。這意味著傳入相同的參數在不同電腦上可能會有不同的結果。在沒有任何有關時區的信息的情況下會將日期視為結果會自動針對當前的計算機時區進行轉換。 在 JavaScript 中處理日期可能會很復雜,我們一起學習 Dates 所有的怪癖并掌握如何使用它。 簡介 在 JavaScript 中處理日期可能...
摘要:在內部,日期以年月日以來的毫秒數表示。以毫秒為單位記錄原因。你也可以使用將返回一個時間戳以毫秒為單位而不是對象。如果您使用天數計算超過一個月,則不會出現錯誤,日期將轉到下個月數月,小時,分鐘,秒和毫秒都是如此。 簡介showImg(https://segmentfault.com/img/bVbfH0e?w=777&h=512); JavaScript通過強大的對象為我們提供日期處理功...
摘要:在內部,日期以年月日以來的毫秒數表示。以毫秒為單位記錄原因。你也可以使用將返回一個時間戳以毫秒為單位而不是對象。如果您使用天數計算超過一個月,則不會出現錯誤,日期將轉到下個月數月,小時,分鐘,秒和毫秒都是如此。 簡介showImg(https://segmentfault.com/img/bVbfH0e?w=777&h=512); JavaScript通過強大的對象為我們提供日期處理功...
摘要:在內部,日期以年月日以來的毫秒數表示。以毫秒為單位記錄原因。你也可以使用將返回一個時間戳以毫秒為單位而不是對象。如果您使用天數計算超過一個月,則不會出現錯誤,日期將轉到下個月數月,小時,分鐘,秒和毫秒都是如此。 簡介showImg(https://segmentfault.com/img/bVbfH0e?w=777&h=512); JavaScript通過強大的對象為我們提供日期處理功...
摘要:而實際上將表示日期的字符串傳遞給構造函數,也會在后臺調用。如果省略其他參數,則統統假設為時間年月日午夜時時間年月日下午構造函數也會模仿,但有一點明顯不同日期和時間都基于本地時區而非創建。不過構造函數仍與接收的參數相同。 Date類型 ECMASCript中的Date類型是在早期中Java中的java.util.Date類基礎上構建的。為此Date類型使用自UTC(國際協調時間)1970...
閱讀 3087·2021-11-24 10:47
閱讀 3842·2021-11-02 14:43
閱讀 2235·2021-09-26 10:15
閱讀 2285·2021-09-08 09:35
閱讀 574·2019-08-30 12:45
閱讀 2784·2019-08-29 17:04
閱讀 3218·2019-08-26 14:05
閱讀 1263·2019-08-26 12:10