JS 日期构造函数与未来日期不一致

问题描述 投票:0回答:1

我正在 Excel 中的 Office 脚本中进行一些日期操作,我注意到未来日期与过去日期的奇怪行为 - 我不知道其他人是否会得到类似的结果,因为我无法始终如一地重新创建此结果。例如,当我运行以下代码时:

let d1 = new Date("2023-12-16"); // some date in the future
let d2 = new Date("2023-1-1");   // some date in the past
console.log(d1);
console.log(d2);

我得到这个输出:

"2023-12-16T00:00:00.000Z"
"2023-01-01T07:00:00.000Z"

我在关于 JS Date 构造函数的讨论中找到了一些很好的信息here,但我仍然不明白。为什么未来的日期不像过去的日期那样推断出我的时区?这是这个构造函数在解析字符串时遇到的另一个问题吗?

但是当我跑步时

let d6 = new Date("2023-9-14");
let d7 = new Date("2023-09-14");
console.log(d6);
console.log(d7);

我明白了

"2023-09-14T06:00:00.000Z"
"2023-09-14T00:00:00.000Z"

(时区似乎也有问题......)

这与指定月份的字符数有关吗?

javascript excel date constructor office-scripts
1个回答
0
投票

这不太难解释:

2023-1-1
不是标准的日期字符串格式,与遵守
ISO 8601
2023-12-16不同。

来自 MDN 文档

将日期格式化为字符串的方法有很多。 JavaScript 规范只指定了一种普遍支持的格式:日期时间字符串格式,ISO 8601 日历日期扩展格式的简化。格式如下:

YYYY-MM-DDTHH:mm:ss.sssZ

当您将字符串传递给 Date 构造函数时,如果您不使用 ISO 8601 格式的日期字符串,则结果非常难以预测

这就是为什么您会得到

"2023-9-14"
"2023-09-14"
不同的结果。第二个字符串遵循 ISO 8601 日历日期扩展格式,而另一个则不遵循。

以 ISO 8601 格式指定日期时,除非您明确指定了偏移量,否则它会相对于 UTC+0(或更常见的是“格林威治标准时间”)进行解释。这可能就是为什么你有一个意外的偏移......没有指定时间或时区,它默认为格林威治的午夜。然后您会看到该时间转换为您当地的时区(似乎比 UTC 早 7 小时...所以可能是在俄罗斯、越南、马来西亚或泰国的某个地方)

当日期字符串不符合 ISO 8601 格式时,行为是未定义的,由每个浏览器做出最佳猜测。我相信您可以想象,鉴于全球各地的本地日期格式多种多样,猜测日期格式会有多困难。结果将在很大程度上取决于您的浏览器区域设置,即使这样,结果也可能会让您感到惊讶。

© www.soinside.com 2019 - 2024. All rights reserved.