JavaScript比较日期
原文:Compare Dates in JavaScript
JavaScript比较日期不太容易,Date类型是对象,比较符按照引用而不是按值进行对比。本文简介如何用原生JavaScript比较日期。
有两个Date
对象:
1 | const d1 = new Date('2019-06-01'); |
如何判断它们是否相等?奇怪的是,三等和二等比较符都无法比较两个日期。
1 | const d1 = new Date('2019-06-01'); |
要比较两个日期,要使用toString()
或valueOf()
。toString()
方法把日期转换为ISO格式的日期字符串,valueOf()
将日期转换为毫秒时间戳。
1 | const d1 = new Date('2019-06-01'); |
< 和 >
虽然==
和===
都不能判断两个日期是否相等,<
和>
却是可以比较日期的:
1 | d1 < d2; // false |
要检查日期a
是否早于日期b
,可以检查a < b
。
另一个技巧:你可以进行日期的减法。a - b
返回的是两个日期相差的毫秒数。
1 | const d1 = new Date('2019-06-01'); |
换言之,可以用a - b
比较两个日期,如果b
晚于a
,则a - b < 0
。
排序
日期数组的排序会有一些奇怪,以下代码得出的竟然是倒序。
1 | const d1 = new Date('2017-06-01'); |
为什么呢?因为JavaScript的排序函数隐式的将数组中所有的值转换为字符串,再进行排序,以上代码中的sort()
是基于以下字符串数组进行排序:
1 | [ 'Fri May 31 2019 20:00:00 GMT-0400 (Eastern Daylight Time)', |
实际上,JavaScript会默认按日期的星期缩写(Mon、Tue、Wed、Thu、Fri、Sat、Sun)进行排序。
要按日期的早晚进行排序,需要向sort()
函数传入一个compare()
回调函数。compare()
函数应该返回:
0
如果a
和b
相等- 正数 如果
a > b
- 负数 如果
a < b
前文提到日期可以做减法,可以用a - b
直接作为比较函数:
1 | const d1 = new Date('2017-06-01'); |