You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:09:45