假设你有两个 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

换句话说,您可以比较两个日期 ab 通过使用 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 如果 ab相等
  • 如果是正数 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]
© 版权声明
评论 抢沙发

请登录后发表评论