如何正确比较带前导0与不带前导0的小时时间?原方案问题分析
问题分析
原代码的问题出在这几个点:
- 每次执行
new Date()都会生成当前实时时间,两次调用哪怕间隔几毫秒,生成的时间对象本身就有差异。 setHours()只传小时参数时,分钟、秒、毫秒会保留当前时间的原始值,这就导致两次设置后的时间戳必然因为毫秒(甚至秒)的不同而不相等。- 虽然"02"和"2"转成数字后都是2,但这不是导致比较失败的原因,核心是时间对象的创建时机和参数不完整。
正确的解决方法
有两种可靠的方式来比较这两个时间字符串:
方法1:直接解析时分数值比较
既然只需要判断两个时间的小时和分钟是否一致,完全不用创建Date对象,直接拆分字符串转成数字对比就行:
const parseTime = (timeStr) => { const [hours, minutes] = timeStr.split(':').map(Number); return { hours, minutes }; }; const time1 = parseTime("02:00"); const time2 = parseTime("2:00"); // 比较小时和分钟都相等 const isEqual = time1.hours === time2.hours && time1.minutes === time2.minutes; console.log(isEqual); // 输出 true
方法2:创建统一基准的时间对象
如果必须用Date对象来比较,要把年、月、日、时、分、秒、毫秒都设置成固定值,避免实时时间的干扰:
const createFixedTime = (timeStr) => { const [hours, minutes] = timeStr.split(':').map(Number); const date = new Date(); // 固定年月日,同时设置时分,秒和毫秒设为0 date.setFullYear(2000, 0, 1); date.setHours(hours, minutes, 0, 0); return date; }; const startTime = createFixedTime("02:00"); const endTime = createFixedTime("2:00"); console.log(startTime.getTime() === endTime.getTime()); // 输出 true
内容的提问来源于stack exchange,提问作者Romillion
相关产品推荐
相关产品推荐

