我刚刚发现这段代码工作得很好(Chrome,Firefox,Node.js):
"2018-06-02" > "2018-05-10"
<- true
"2018-06-02" > "2020-05-10"
<- false
这真的打算这样工作吗?除了将它们转换为单独的 Date 对象并在之后进行比较之外,我找不到任何关于在 JavaScript 中比较此类格式化字符串的信息。 这里发生了什么,字符串是否在内部转换为数字/日期/字符?
这个不正确的陈述似乎在某种程度上也有效:
"2018-06-20" > "2018-05-40"
<- true
这真的打算这样工作吗?
如果字符串是有效日期,那很好,但不是专门因为它们是日期。
字符串按词典(松散,字母)顺序从左到右进行比较。由于"0"小于"1","1"小于"2"等,并且由于这些字符串具有最重要的日期部分(年)在前,最低有效部分(天)在最后,因此词典顺序也恰好是日期顺序。
如果字符串采用欧洲 DD/MM/YYYY 格式或美国 MM/DD/YYYY 格式,则它不起作用,因为这些字符串没有按最重要到最不重要的顺序排列的最多日期部分。
"2018-06-20" > "2018-05-40"
的原因是真的,但将它们作为日期进行比较,使用对第二个应该意味着什么的合理解释(日期 2018-06-09),将是错误的,因为它们再次被比较为字符串,逐个字符。没有进行规范化,根本没有特定于日期的逻辑。
您可以比较任何类型的字符串。
"a" < "b"
这称为词典比较。它将从左到右,逐个字符,如果字符不同,它将比较字母表中的位置。对于具有相同长度的数字,它将按预期工作,因此它也适用于 ISO 日期字符串。
它不起作用的一些示例:
"19" > "2" // false, "2" is bigger "1"
"12:35 23.4.2019" < "12:34 25.4.2019" // false, "4" is smaller "5"