Javascript 如果填充0,JS为什么假定字符串日期(不含时间)为UTC,如果不填充则为local?

Javascript 如果填充0,JS为什么假定字符串日期(不含时间)为UTC,如果不填充则为local?,javascript,java,date,localdate,Javascript,Java,Date,Localdate,这很奇怪,但我相信有一个完美的解释 我和我的团队最近发现,当使用java的LocalDate并使用默认字符串格式“YYYY-MM-DD”将其发送回前端时,Javascript会自动创建一个日期,假设字符串是UTC,因此在ET区域生活时,它会自动减去-5小时 很烦人,但我们明白了 但是,当我们将其与时间一起发送回so“yyy-MM-DDThh:MM:ss”时,它将其解析为本地日期。好吧,奇怪。。。但它变得更奇怪了 奇怪的是,如果我们在日期上发送不带0填充的字符串,那么它会将其解析为本地日期为什么?

这很奇怪,但我相信有一个完美的解释

我和我的团队最近发现,当使用java的LocalDate并使用默认字符串格式“YYYY-MM-DD”将其发送回前端时,Javascript会自动创建一个日期,假设字符串是UTC,因此在ET区域生活时,它会自动减去-5小时

很烦人,但我们明白了

但是,当我们将其与时间一起发送回so“yyy-MM-DDThh:MM:ss”时,它将其解析为本地日期。好吧,奇怪。。。但它变得更奇怪了

奇怪的是,如果我们在日期上发送不带0填充的字符串,那么它会将其解析为本地日期为什么?

下面是一个例子:

新日期(“2017-12-09”)
//输出:2017年12月8日星期五19:00:00 GMT-0500(东部标准时间)
新日期(“2017-12-9”)
//输出:2017年12月9日星期六00:00:00 GMT-0500(东部标准时间)

为什么会这样?

答案取决于您的浏览器实现

注意:由于浏览器差异和不一致,强烈建议使用日期构造函数(和date.parse是等效的)解析日期字符串。仅按惯例支持RFC 2822格式字符串。对ISO 8601格式的支持不同之处在于,仅日期字符串(例如“1970-01-01”)被视为UTC,而不是本地字符串


ISO 8601需要填充,因此
2017-12-09
是ISO 8601,而
2017-12-9
不是。所以你的报价似乎可以解释。有什么原因吗?我不明白为什么他们会对date only和datetime字符串区别对待。Javascript是一种“古老”的语言,在实现之间经历了很多变化和斗争(看看你,IE)。众所周知,Javascript是一种设计选择令人质疑的语言。这就解释了为什么作为开发人员,我们经常使用库来抽象这些奇怪的选择。(如果你想了解更多关于JS的历史,我建议:)酷!谢谢我通常使用momentjs,所以我不习惯遇到这些约会奇事。不客气。另外,也可以查看日期fns,它是momentIn的一个很好的轻量级替代品。在一些浏览器中,
新日期(“2017-12-9”)
会生成一个无效的日期。解析非标准字符串(即任何不受支持的字符串)取决于实现。