JavaScript中高效比较同年月日日期的方法咨询
如何高效判断JavaScript中两个日期是否为同一天
需求:给定两个日期对象(如date1 = new Date('2024-5-13T20:30:00')、date2 = new Date('2024-5-13T21:30:20')),仅比较年、月、日部分判断是否为同一天,同时规避原字符串分割方法的性能损耗。
方案1:直接比对年、月、日数值
这是性能最优的方案,直接读取日期对象的核心属性值进行比对,完全避免字符串操作:
function isSameDay(date1, date2) { return date1.getFullYear() === date2.getFullYear() && date1.getMonth() === date2.getMonth() && date1.getDate() === date2.getDate(); }
原理:getFullYear()返回4位数年份,getMonth()返回0-11的月份值,getDate()返回当月日期数,三者完全相等则说明是同一天。
方案2:归一化到当天起始时间戳比对
将两个日期统一转换为当天00:00:00的时间戳,再做数字比对:
function isSameDay(date1, date2) { const getDayStartTimestamp = (date) => { const normalized = new Date(date); normalized.setHours(0, 0, 0, 0); // 重置时分秒及毫秒为0 return normalized.getTime(); }; return getDayStartTimestamp(date1) === getDayStartTimestamp(date2); }
原理:通过setHours(0,0,0,0)把日期对齐到当天起始时刻,转成时间戳(数字类型)后比对性能优异,且这种归一化方式便于后续扩展到周、月等更大时间单位的比对。
原方案的性能问题说明
原方法date1.toISOString().split('T')[0] === date2.toISOString().split('T')[0]需要先将日期对象转换为ISO格式字符串,再执行分割操作,涉及字符串的生成、遍历和截取,在大量日期比对的场景下,性能会明显低于上述两种直接操作日期属性或时间戳的方案。
内容的提问来源于stack exchange,提问作者dariush jokar
相关产品推荐
相关产品推荐

