Javascript Date.UTC()未返回预期结果

Javascript Date.UTC()未返回预期结果,javascript,arrays,date,Javascript,Arrays,Date,我正在尝试从一组值创建UTC日期。文档中指出,如果省略任何参数,则默认值应为0或1 语法: Date.UTC(year, month[, day[, hour[, minute[, second[, millisecond]]]]]) var tp = [2019] var d = new Date(Date.UTC.apply(null, tp)) console.log(d.toString()) var tp = [2019, 01] 示例: Date.UTC(year, mont

我正在尝试从一组值创建UTC日期。文档中指出,如果省略任何参数,则默认值应为0或1

语法:

Date.UTC(year, month[, day[, hour[, minute[, second[, millisecond]]]]])
var tp = [2019]
var d  = new Date(Date.UTC.apply(null, tp))
console.log(d.toString())
var tp = [2019, 01]
示例:

Date.UTC(year, month[, day[, hour[, minute[, second[, millisecond]]]]])
var tp = [2019]
var d  = new Date(Date.UTC.apply(null, tp))
console.log(d.toString())
var tp = [2019, 01]
结果:
“无效日期”


示例#2:

Date.UTC(year, month[, day[, hour[, minute[, second[, millisecond]]]]])
var tp = [2019]
var d  = new Date(Date.UTC.apply(null, tp))
console.log(d.toString())
var tp = [2019, 01]
结果:
“2019年1月31日星期四18:00:00 GMT-0600(CST)”

预计:
“2019年1月1日星期四00:00:00 GMT-0600(CST)”


有人能解释一下这里发生了什么吗


更新:

Date.UTC(year, month[, day[, hour[, minute[, second[, millisecond]]]]])
var tp = [2019]
var d  = new Date(Date.UTC.apply(null, tp))
console.log(d.toString())
var tp = [2019, 01]
我应该澄清一下,我使用的API是MDN状态。问题是Safari没有最新的实现。这在另一位SO用户的帮助下得到了验证,幸运的是,他更新了文档

第二个示例来自一个误解,即
.toISOString()
是零索引的,而它生成的值的时区偏移量为0,而不是月份是零索引的。

示例#1 您引用的行表示ES5环境中需要年份和月份。如果您需要支持较旧的执行环境,那么您不可能仅仅度过这一年

然而,正如T.J.Crowder在评论中指出的,该代码似乎有效。您正在哪个浏览器中试用它

示例2 JavaScript日期中的月份为0索引。这意味着月份
1
(或
01
)是二月

因此
Date.UTC(2019,01)
生成2019年2月1日UTC午夜的时间戳,该时间戳对应于2019年1月31日下午6点(美国标准时间)

还有一件事:您应该避免在JavaScript数字文本前面加上
0
,因为这是表示八进制的语法。这意味着
020==16

示例#1 您引用的行表示ES5环境中需要年份和月份。如果您需要支持较旧的执行环境,那么您不可能仅仅度过这一年

然而,正如T.J.Crowder在评论中指出的,该代码似乎有效。您正在哪个浏览器中试用它

示例2 JavaScript日期中的月份为0索引。这意味着月份
1
(或
01
)是二月

因此
Date.UTC(2019,01)
生成2019年2月1日UTC午夜的时间戳,该时间戳对应于2019年1月31日下午6点(美国标准时间)


还有一件事:您应该避免在JavaScript数字文本前面加上
0
,因为这是表示八进制的语法。这意味着
020==16

您正在使用
date.UTC
创建UTC日期,因此您得到的是00:00 UTC而不是00:00 CST。此外,该签名会根据需要显示
年、月
,所有可选值都放在方括号中。您为
日期.UTC
显示的“语法”<代码>月份不是必需的。看起来是的。我已经修好了。@T.J.Crowder:它不是完全不正确,只是过时了。ES5 ES2016中需要月份,因此示例#1的无效日期可能来自旧环境。@Ry--为什么,:-)@谢谢你帮我修好了。通常我会更仔细地检查这些东西!(我假设您是MDN上的rno,名称和位置相似;-)。您使用
date.UTC
创建UTC日期,因此您使用的是00:00 UTC而不是00:00 CST。此外,该签名会根据需要显示
年、月
,所有可选值都放在方括号中。您为
日期.UTC
显示的“语法”<代码>月份不是必需的。看起来是的。我已经修好了。@T.J.Crowder:它不是完全不正确,只是过时了。ES5 ES2016中需要月份,因此示例#1的无效日期可能来自旧环境。@Ry--为什么,:-)@谢谢你帮我修好了。通常我会更仔细地检查这些东西!(我假设您是MDN上的rno,来自相似的名称和位置;-)。引用的行,
month
不是必需的。这不仅仅是因为它可以工作,还因为它被指定可以工作。@LeviRoberts您引用的这行代码表示它生成的值的时区偏移量为0,而不是月份的索引为零。@LeviRoberts您可以使用partials,只要您使用(请参阅“短日期(和时间)表单”一节,并确保阅读“浏览器支持”一节).@T.J.Crowder-ECMAScript 2018起,内置解析器需要支持3种格式:toString、toISOString和ToutString生成的格式,这些格式现在在ECMA-262中指定。@str您的语句“您可以使用部分…”必须进一步限定,以包括依赖于实现的解析,并且
无效日期
是一致的结果。您的链接答案也需要更新,因为从ECMAScript 2018起,将支持3种格式。请参阅。引用的行,
month
不是必需的。这不仅仅是因为它可以工作,还因为它被指定可以工作。@LeviRoberts您引用的这行代码表示它生成的值的时区偏移量为0,而不是月份的索引为零。@LeviRoberts您可以使用partials,只要您使用(请参阅“短日期(和时间)表单”一节,并确保阅读“浏览器支持”一节).@T.J.Crowder-ECMAScript 2018起,内置解析器需要支持3种格式:toString、toISOString和ToutString生成的格式,这些格式现在在ECMA-262中指定。@str您的语句“您可以使用部分…”必须进一步限定,以包括依赖于实现的解析,并且
无效日期
是一致的结果。您的链接答案也需要更新,因为从ECMAScript 2018起,将支持3种格式。看见