Date.toString() 比较结果异常求助:为何两次比较结果不同?
为什么这两个日期字符串比较结果会反直觉?
这是因为你在比较日期的字符串表示,而非日期的实际时间先后。JavaScript里的字符串比较是按**字典序(ASCII码顺序)**逐字符对比的,而Date.prototype.toString()的输出格式刚好导致了这种看似矛盾的结果。
让我们逐个拆解例子:
第一个例子:new Date(2015, 10, 9).toString() > new Date(2015, 9, 10).toString() → 返回 false
首先得明确:JavaScript的Date构造函数中,月份是从0开始计数的:
new Date(2015, 10, 9)对应 2015年11月9日new Date(2015, 9, 10)对应 2015年10月10日
它们的toString()输出(英文环境下)大概是这样:
"Mon Nov 09 2015 00:00:00 GMT+0800 (中国标准时间)" "Sat Oct 10 2015 00:00:00 GMT+0800 (中国标准时间)"
字符串比较时是从左到右逐字符比的:
- 第一个不同的字符出现在星期缩写:
"Mon"的首字母M(ASCII码77) vs"Sat"的首字母S(ASCII码83) - 因为77 < 83,所以整个
"Mon..."字符串小于"Sat...",因此>运算符返回false。
第二个例子:new Date(2015, 5, 9).toString() > new Date(2015, 4, 10).toString() → 返回 true
同样先解析日期:
new Date(2015, 5, 9)对应 2015年6月9日new Date(2015, 4, 10)对应 2015年5月10日
它们的toString()输出是:
"Tue Jun 09 2015 00:00:00 GMT+0800 (中国标准时间)" "Sun May 10 2015 00:00:00 GMT+0800 (中国标准时间)"
字符串对比时:
- 星期缩写
"Tue"的首字母T(ASCII码84) vs"Sun"的首字母S(ASCII码83) - 84 > 83,所以
"Tue..."字符串大于"Sun...",因此>运算符返回true。
正确的日期比较姿势
如果要比较日期的实际先后,直接比较Date对象(内部会自动转成时间戳对比)或者获取时间戳后对比就好:
// 直接比较Date对象 console.log(new Date(2015, 10, 9) > new Date(2015, 9, 10)) // true(11月9日确实晚于10月10日) console.log(new Date(2015, 5, 9) > new Date(2015, 4, 10)) // true(6月9日晚于5月10日) // 或者获取时间戳对比 console.log(new Date(2015, 10, 9).getTime() > new Date(2015, 9, 10).getTime()) // true
内容的提问来源于stack exchange,提问作者Mario
相关产品推荐
相关产品推荐

