JavaScript 日期怎么比较
在日常做网页开发的时候,我们经常需要判断“用户预约的时间是不是已经过了”“两个活动哪一个更早开始”,这些场景都离不开日期比较。很多刚学JavaScript的朋友会觉得日期比较很绕——毕竟它不像比较数字那样直接,需要先搞懂日期的本质,再用对方法。
先搞懂:JavaScript里的日期到底是什么?
你可以把JavaScript的Date对象想象成“时间的数字转换器”。它的本质是一个存储了从1970年1月1日0点(UTC时间)到指定时间的毫秒数的数字,比如1699999999000,就是一个能代表具体时间的“时间戳”。

举个生活化的例子:把日期当成快递的“物流单号”,这个单号是一串唯一的数字,能精准对应到某一秒;而我们看到的“2024年11月1日”,只是这个单号对应的“快递信息摘要”。如果想比较两个快递的先后,直接比单号数字就好,不用纠结快递显示的是“11月1日”还是“11月2日”。
最简单的比较:用“时间戳”直接比
既然日期的本质是数字,那比较两个日期的先后,就可以先把它们转成时间戳,再用大于、小于这些运算符直接比。这是新手最容易上手、也最不容易出错的方法。
比如要判断“今天是不是在2024年圣诞节之前”,可以这么写:
`javascript
// 获取今天的日期对象
const today = new Date();
// 圣诞节的日期对象
const christmas = new Date('2024-12-25');
// 转成时间戳后比较
if (today.getTime() < christmas.getTime()) {
console.log('还没到圣诞节,继续等!');
} else {
console.log('圣诞节已经过啦~');
}
`
这里的getTime()方法,就是专门把Date对象转成毫秒级时间戳的,相当于“拿快递单号比大小”。要注意的是,直接把Date对象当数字用也可以,比如+today会自动转成时间戳,所以也能写成if (+today < +christmas)</code>,不过写getTime()会更直观,不容易搞错。
容易踩的坑:别直接用“日期字符串”比
很多朋友会偷懒,直接把两个写好的日期字符串放在一起比较,比如'2024-12-01' > '2024-11-01',结果明明12月应该在后面,却返回了false。这是因为JavaScript里的字符串比较,是按每个字符的ASCII码逐个比,不是按时间先后。
比如字符串'2024-12'和'2024-11',前5个字符都是'2024-',第6个字符'1'和'1'相同,第7个字符'2'比'1'大,所以'2024-12' > '2024-11'是true,刚好这次结果对了;但如果是'10:00'和'2:00',字符串比较时第一个字符'1'的ASCII码(49)比'2'(50)小,结果'10:00' < '2:00'</code>,但10点明明比2点晚,就完全错了。所以日期比较绝对不能直接比字符串。
进阶用法:比较日期的“部分属性”
有时候我们不需要精确到毫秒,只需要比较“日期”“小时”这种部分,比如判断两个日期是不是同一天,或者是不是同一小时。这时候可以用Date对象的getFullYear()(年)、getMonth()(月,注意是从0开始的,1代表2月)、getDate()(日)这些方法,分别取出对应的值比较。
比如判断“两个时间是不是同一天”:
`javascript
function isSameDay(date1, date2) {
return date1.getFullYear() === date2.getFullYear()
&& date1.getMonth() === date2.getMonth()
&& date1.getDate() === date2.getDate();
}
// 测试:2024年11月1日10点和11月1日15点,应该返回true
console.log(isSameDay(new Date('2024-11-01 10:00'), new Date('2024-11-01 15:00')));
`
这个方法就像“拿快递的收件地址(年/月/日)比,不用比具体的取件时间(小时/分钟)”,刚好对应了我们要的“同一天”需求。
总结一下,JavaScript日期比较的核心就是“先转成能代表时间的数字(时间戳)再比,或者按需要取出对应的日期部分再比”,避开直接比字符串的坑,就能搞定大部分开发场景的需求了。