使用JavaScript比较两个日期

使用JavaScript比较两个日期

技术背景

在前端开发中,经常会遇到需要比较两个日期的场景,例如判断活动的开始和结束时间、筛选特定日期范围内的数据等。JavaScript提供了一些内置的方法和对象来处理日期比较,掌握这些方法可以帮助开发者更高效地完成日期相关的业务逻辑。

实现步骤

1. 创建Date对象

首先,需要将日期数据转换为Date对象,这样才能使用JavaScript提供的日期比较功能。可以通过以下几种方式创建Date对象:

1
2
3
4
5
6
7
8
// 直接创建当前日期对象
var d1 = new Date();

// 根据特定日期字符串创建对象
var d2 = new Date('2023-01-01');

// 根据年、月、日等参数创建对象(注意:月份从0开始计数)
var d3 = new Date(2023, 0, 1);

2. 比较日期

使用关系运算符(<、<=、>、>=)

可以直接使用关系运算符比较两个Date对象的大小:

1
2
3
4
5
6
var d1 = new Date(2023, 0, 1);
var d2 = new Date(2023, 0, 2);
console.log(d1 < d2); // true
console.log(d1 <= d2); // true
console.log(d1 > d2); // false
console.log(d1 >= d2); // false

使用相等运算符(==、!=、===、!==)

使用相等运算符比较日期时,不能直接比较Date对象,需要比较它们的时间戳(毫秒数)。可以使用getTime()valueOf()方法或+前缀来获取时间戳:

1
2
3
4
5
var d1 = new Date(2023, 0, 1);
var d2 = new Date(2023, 0, 1);
console.log(d1.getTime() === d2.getTime()); // true
console.log(d1.valueOf() === d2.valueOf()); // true
console.log(+d1 === +d2); // true

3. 忽略时间部分比较日期

如果只需要比较日期部分(忽略时间),可以自定义函数来实现:

1
2
3
4
5
6
7
8
9
function isSameDay(d1, d2) {
return d1.getFullYear() === d2.getFullYear() &&
d1.getDate() === d2.getDate() &&
d1.getMonth() === d2.getMonth();
}

var d1 = new Date('2023-01-01 12:00:00');
var d2 = new Date('2023-01-01 18:00:00');
console.log(isSameDay(d1, d2)); // true

核心代码

自定义日期比较工具函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
var dates = {
convert: function (d) {
return (
d.constructor === Date ? d :
d.constructor === Array ? new Date(d[0], d[1], d[2]) :
d.constructor === Number ? new Date(d) :
d.constructor === String ? new Date(d) :
typeof d === "object" ? new Date(d.year, d.month, d.date) :
NaN
);
},
compare: function (a, b) {
return (
isFinite(a = this.convert(a).valueOf()) &&
isFinite(b = this.convert(b).valueOf()) ?
(a > b) - (a < b) :
NaN
);
},
inRange: function (d, start, end) {
return (
isFinite(d = this.convert(d).valueOf()) &&
isFinite(start = this.convert(start).valueOf()) &&
isFinite(end = this.convert(end).valueOf()) ?
start <= d && d <= end :
NaN
);
}
};

// 使用示例
var date1 = '2023-01-01';
var date2 = '2023-01-02';
console.log(dates.compare(date1, date2)); // -1

使用Moment.js进行日期比较

1
2
3
4
5
6
7
8
9
function compare(dateTimeA, dateTimeB) {
var momentA = moment(dateTimeA, "DD/MM/YYYY");
var momentB = moment(dateTimeB, "DD/MM/YYYY");
if (momentA > momentB) return 1;
else if (momentA < momentB) return -1;
else return 0;
}

console.log(compare("11/07/2015", "10/07/2015")); // 1

最佳实践

  • 输入验证:在进行日期比较之前,确保输入的日期数据是合法的,避免出现NaN等错误。
  • 时区处理:JavaScript的Date对象本身没有时区概念,在处理日期时要注意时区的影响。可以使用Date.UTC()方法创建UTC日期对象,或者使用toISOString()getUTCxxx()等方法来处理时区问题。
  • 使用工具库:如果需要处理复杂的日期操作,建议使用第三方工具库,如Moment.js,它提供了丰富的日期处理方法,能大大简化开发过程。

常见问题

直接使用相等运算符比较日期对象结果错误

1
2
3
4
var d1 = new Date();
var d2 = new Date(d1);
console.log(d1 == d2); // false
console.log(d1 === d2); // false

原因:直接使用相等运算符比较Date对象时,比较的是对象的引用,而不是日期的值。解决方法是比较它们的时间戳。

时区问题导致日期比较结果不准确

JavaScript的Date对象默认使用本地时区,在进行日期比较时可能会因为时区不同而导致结果不准确。解决方法是使用UTC日期对象进行比较,或者在比较时统一处理时区。例如:

1
2
var myDate = new Date();
var utcDate = new Date(Date.UTC(myDate.getFullYear(), myDate.getMonth(), myDate.getDate()));

使用JavaScript比较两个日期
https://119291.xyz/posts/2025-05-13.compare-two-dates-with-javascript/
作者
ww
发布于
2025年5月13日
许可协议