new Date() 为时区返回不同的值,具有不同的输入

new Date() returning different values for time zones, with different inputs

var date1 = "2015-03-29";
console.log(new Date(date1)); //Output:Sun Mar 29 2015 05:30:00 GMT+0530 (India Standard Time)

var date2 = "1869-12-31";
console.log(new Date(date2)); //Output:Fri Dec 31 1869 05:53:20 GMT+0553 (India Standard Time)

var date3 = "1870-01-01";
console.log(new Date(date3)); //Output:Sat Jan 01 1870 05:21:10 GMT+0521 (India Standard Time)

在调试一些 Date() 相关问题时,看到 Date() 在不同输入下的上述行为。

尽管我的系统时区是 GMT +05:30

,但所有三个输入的时区都不同

这是预期的吗?

提前感谢您的帮助!

您显示的值是正确的。

ECMAScript 要求将 YYYY-MM-DD 格式的 date-only 值视为 UTC。来自 the spec:

... When the UTC offset representation is absent, date-only forms are interpreted as a UTC time and date-time forms are interpreted as a local time.

然后 toString 函数转换为本地时间的字符串表示形式,其中考虑了系统时区。

印度的 IANA 时区数据,包括丰富的文档注释,can be found here。数据本身如下(截至tzdata 2021a版本):

# Zone  NAME            STDOFF    RULES    FORMAT    [UNTIL]
Zone    Asia/Kolkata    5:53:28   -        LMT       1854 Jun 28  # Kolkata
                        5:53:20   -        HMT       1870         # Howrah Mean Time?
                        5:21:10   -        MMT       1906 Jan  1  # Madras local time
                        5:30      -        IST       1941 Oct
                        5:30      1:00     +0630     1942 May 15
                        5:30      -        IST       1942 Sep
                        5:30      1:00     +0630     1945 Oct 15
                        5:30      -        IST

您可以在第二行和第三行数据中看到示例中两个较早的偏移量。如果您选择更早的日期(1854-06-28 之前),您将获得与第一行的偏移量。您还可以看到印度在两个不同的历史时期使用了 +06:30 偏移量。

timeanddate.com here.

还可以以更 human-readable 的形式获得所有历史记录

这就是时区的工作原理。它们不固定为单个数字偏移量,而是一个偏移量适用于特定时间点的时区,并且该偏移量可以随控制该时区的政府的心血来潮而改变。有关更多信息,请阅读 the timezone tag wiki.

中标题为“时区!= 偏移量”的部分