假设你有两个 JavaScript Date
对象:
const d1 = new Date(2019-06-01);
const d2 = new Date(2018-06-01);
const d3 = new Date(2019-06-01);
如果两个日期相等,您如何比较? 令人惊讶的是, 双等号 都不起作用。
const d1 = new Date(2019-06-01);
const d2 = new Date(2018-06-01);
const d3 = new Date(2019-06-01);
d1 === d3; // false
d1 == d3; // false
要比较两个日期,您可以使用 toString()
或者 valueOf()
,toString()
方法将日期转换为 ISO 日期字符串,并且 valueOf()
方法将日期转换 为自 epoch 以来的毫秒数 。
const d1 = new Date(2019-06-01);
const d2 = new Date(2018-06-01);
const d3 = new Date(2019-06-01);
// Fri May 31 2019 20:00:00 GMT-0400 (Eastern Daylight Time)
d1.toString();
d1.valueOf(); // 1559347200000
d1.toString() === d2.toString(); // false
d1.toString() === d3.toString(); // true
d1.valueOf() === d2.valueOf(); // false
d1.valueOf() === d3.valueOf(); // true
Before and After
虽然两者都没有 ==
也不 ===
可以比较两个日期是否相等,令人惊讶的是两者 <
和 >
可以很好地比较日期:
d1 < d2; // false
d1 < d3; // false
d2 < d1; // true
所以要检查日期 a
在日期之前 b
,你可以检查 a < b
。
另一个巧妙的技巧:你可以在 JavaScript 中减去日期。 减法 a - b
以毫秒为单位为您提供两个日期之间的差异。
const d1 = new Date(2019-06-01);
const d2 = new Date(2018-06-01);
const d3 = new Date(2019-06-01);
d1 - d3; // 0
d1 - d2; // 1 year in milliseconds, 1000 * 60 * 60 * 24 * 365
换句话说,您可以比较两个日期 a
和 b
通过使用 a - b
,如果 b
在之后 a
, 然后 a - b < 0
。
排序
在 JavaScript 中对日期数组进行排序并不像您预期的那样工作。下面 sort()
call 以相反的顺序为您提供日期。
const d1 = new Date(2017-06-01);
const d2 = new Date(2018-06-01);
const d3 = new Date(2019-06-01);
[d2, d1, d3].sort(); // [d3, d2, d1]
这是为什么? 因为 JavaScript 的 sort 函数 会在排序前将数组中的所有值隐式转换为字符串。所以以上 sort()
实际上是根据以下字符串值进行排序:
[ Fri May 31 2019 20:00:00 GMT-0400 (Eastern Daylight Time),
Thu May 31 2018 20:00:00 GMT-0400 (Eastern Daylight Time),
Wed May 31 2017 20:00:00 GMT-0400 (Eastern Daylight Time) ]
换句话说,默认情况下,JavaScript 根据星期几对日期数组进行隐式排序,要根据先发生的日期对日期进行排序,您需要传递一个 compare()
回调 到 sort()
功能。compare()
函数应该返回:
0
如果a
和b
相等- 如果是正数
a > b
- 如果是负数
a < b
由于 JavaScript 允许您减去日期,因此您可以使用 a - b
作为您的比较功能:
const d1 = new Date(2017-06-01);
const d2 = new Date(2018-06-01);
const d3 = new Date(2019-06-01);
[d2, d1, d3].sort((a, b) => a - b); // [d1, d2, d3]
请登录后查看评论内容