![](/img/trans.png)
[英]getting next date with 2019-03-23T18:30:00.000Z in angular/javascript
[英]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
的確切格式:
new Date("2022-08-31")
返回 2022-08-31 00:00:00 UTC。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.