Javascript 为什么解析区域设置日期字符串会导致无效日期?

Javascript 为什么解析区域设置日期字符串会导致无效日期?,javascript,date,Javascript,Date,有人能解释一下为什么下面的代码片段会导致无效的日期对象吗 new Date(new Date().toLocaleString()) // or Date.parse(new Date().toLocaleString()) 以无法分析的格式返回当前日期,从而导致意外日期。这是(emphasis mine)明确允许的: …如果引用的所有属性都有其初始值,则以下所有表达式应在该实现中生成相同的数值: x.valueOf() Date.parse(x.toString()) Date.parse(

有人能解释一下为什么下面的代码片段会导致无效的日期对象吗

new Date(new Date().toLocaleString())
// or
Date.parse(new Date().toLocaleString())

以无法分析的格式返回当前日期,从而导致意外日期。

这是(emphasis mine)明确允许的:

…如果引用的所有属性都有其初始值,则以下所有表达式应在该实现中生成相同的数值:

x.valueOf()
Date.parse(x.toString())
Date.parse(x.toUTCString())
Date.parse(x.toISOString())
但是,

Date.parse(x.toLocaleString())
不需要生成与前三个表达式相同的数值,通常,
日期生成的值。当给定任何不符合日期-时间字符串格式的字符串值时,解析
取决于实现。
()而在该实现中,
toString
toutstring
方法无法产生这种结果


由于生成符合日期时间字符串格式的字符串不需要
toLocaleString
,因此允许其输出不被
Date.parse

正确解析,毕竟解析所需的所有信息都是可用的,有可能生成那个字符串。。。此外,在提供格式时没有“精确解析”,所以我的问题是,如果没有第三方库,是否有可能?这是一个新问题。当然,这可能是可能的,但由于您正试图解析依赖于区域设置的字符串,因此要这样做会带来很大的麻烦。您最好使用一个库,比如您可能永远不应该创建从
到本地查询的日期。它可能是非常模糊的,例如,瑞典是世界上唯一使用YYYY/MM/DD的国家。如果我们尝试使用瑞典日期(1970/08/01)作为输入,您可能会得到1月8日,而不是8月1日。这是因为
新日期
接受符合IETF的RFC 2822时间戳格式或ISO8601格式的字符串,它不支持随机本地日期字符串,像那些由
toLocalString
创建的,不“允许”意味着一些明确的东西,比如“来自
Date.toString()的输出不必在
Date.parse
之前能够解析”?我认为输入/输出格式不兼容…@Cerbrus我同意你引用的句子中的措辞:“
d.toLocalString()
不必在
Date.parse
”这就是我用短语表达的意思,“它允许[
toLocalString
”无法在日期前正确解析输出。parse
“我(学究般地)不同意“不兼容”一词,这向我暗示了一个关于
parse
解析
toLocaleString
输出能力的否定断言。由于
parse
toLocalString
都有实现定义的行为,因此它们的兼容性是实现定义的(因此它具有规范未定义的兼容性)。