簡體   English   中英

為什么 new Date("2022-08-31").toISOString() 在 console.log() 中顯示為 2022-08-30T18:30:00.000Z?

[英]Why new Date("2022-08-31").toISOString() is shown as 2022-08-30T18:30:00.000Z in console.log()?

我正在以 Javascript 中的以下格式將請求作為日期值發送到服務器。

新日期(年+"-"+月+"-"+"31").toISOString()

但是當我在控制台中登錄時

console.log(new Date(year+"-"+month+"-"+"31").toISOString())

它顯示為

2022-08-30T18:30:00.000Z

這造成了嚴重的麻煩,因為我無法從“某月”和“某年”的日期 31 的數據庫中獲取記錄,因為日期 31 轉換為 30,如上所示。 如何克服這個問題?

為什么new Date("2022-8-31").toISOString()將日期更改為 2022-08-30?

首先,請注意new Date(string)的行為取決於string的確切格式:

  • 如果格式為 YYYY-MM-DD,其中 MM 和 DD 都是兩位數,則日期被視為 UTC。 例如, new Date("2022-08-31")返回 2022-08-31 00:00:00 UTC。
  • 如果格式是 YYYY-M-DD,其中 M 是一位數字,則日期被視為本地日期,至少在所有流行的瀏覽器中是這樣。 (從技術上講,行為取決於瀏覽器。)例如,如果您在印度,則new Date("2022-8-31")返回 2022-08-31 00:00:00+05:30。

在您的情況下,看起來month是數字 8 或字符串"8" ,而不是字符串"08" ,因此日期被視為本地日期。

其次,請注意toISOString始終返回 UTC 日期字符串。 從當地時間午夜到 UTC 的轉換可能會根據當地時區將日期部分向前或向后調整一天。 例如,2022-08-31 00:00:00+05:30 轉換為等效的 2022-08-30 18:30:00 UTC。

我怎樣才能解決這個問題?

確保將零填充日期傳遞給new Date(string) ,或者更好的是,完全避免日期解析:

new Date(Date.UTC(year, month - 1, day)).toISOString()

ECMAScript 實現如何解析日期通常是由實現定義的。 規范中的唯一要求是以一秒的粒度解析時間戳應該通過Date.prototype.toString()Date.prototype.toISOString()Date.prototype.toUTCString()無損地往返。 特別是那些函數解析output以外的格式甚至不需要成功 即使成功了,也不知道主機會將日期解釋為 UTC 還是本地時區。 一項提議正在進行中,以建立更廣泛的互操作性表面,但進展緩慢。

在實踐中,當涉及到日期格式時,實現是相當寬松的,所以如果您希望您的日期始終被解釋為 UTC 時區,那么在字符串中附加"Z"" GMT"可能就足夠了。 您還可以查看提案存儲庫中通常支持的日期格式。

但是,如果您想確保您的日期在任何地方都能始終如一地解析,最好手動完成。 尤其是如果您在瀏覽器中執行此操作:至少在提案落地之前(可能是在那之后的一段時間),您永遠不知道您的代碼最終會在哪個瘋狂的瀏覽器下運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM