在循环中使用力矩时产生了奇怪的结果



我试图使用循环内的时刻来确定两个日期之间有多少60分钟的时间段,但我得到了奇怪的结果。

const timeSlots: Moment[] = [];
let startDate = moment('2020-03-09 11:00');
let endDate = moment('2020-03-09 12:30');
while (endDate.diff(startDate, 'minutes') >= 60) {
timeSlots.push(startDate.clone());
startDate.add(30, 'minutes');
}
console.log(timeSlots);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>

结果:

2020-03-09 11:00
2020-03-09 11:00

预期:

2020-03-09 11:00
2020-03-09 11:30

奇怪的代码片段在我的计算机或https://playcode.io/它不是

解决方法是使用unix时间戳进行计算。一小时有3600秒=3600000毫秒:

const timeSlots = [];
let startDate = moment.utc('2020-03-09 11:00').valueOf();
let endDate = moment.utc('2020-03-09 14:30').valueOf();
while ((endDate-startDate) >= 3600000) {
timeSlots.push(moment.utc(startDate));
startDate += 3600000;
}
console.log(timeSlots.map(slot => slot.toString()));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>

更新:

经过一些研究,似乎console.log(timeSlots)语句是问题所在。这会记录一些我们不应该关心的内部属性。它似乎像预期的那样工作,如果我们使用:

const timeSlots = [];
let startDate = moment('2020-03-09 11:00');
let endDate = moment('2020-03-09 12:30');
while (endDate.diff(startDate, 'minutes') >= 60) {
timeSlots.push(startDate.clone());
startDate.add(30, 'minutes');
}
console.log(timeSlots.map(slot => slot.format()));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>

最新更新