在 JavaScript 中比较日期大小

发布于 2022-09-07 00:16:52 字数 3465 浏览 149 评论 0

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

娇纵

暂无简介

0 文章
0 评论
21 人气
更多

推荐作者

烙印

文章 0 评论 0

singlesman

文章 0 评论 0

独孤求败

文章 0 评论 0

晨钟暮鼓

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文