计算 javascript 中两个日期和时间之间的小时数

calculating hours between two dates and time in javascript

我正在尝试计算两个不同日期和时间的总小时数和分钟数:

下面是我的代码:

let startShiftTime = moment(StartTime, ['DD-MM-YYYY h:mm:ss A'])
    .utcOffset(0, false)
    .format('DD-MM-YYYY hh:mm:ss A');

let endShiftTime = moment(EndTime, ['DD-MM-YYYY h:mm:ss A'])
    .utcOffset(0, false)
    .format('DD-MM-YYYY hh:mm:ss A');

var TotalSeconds = moment(startShiftTime, 'DD-MM-YYYY hh:mm:ss A')
    .utcOffset(0, false)
    .diff(
        moment(endShiftTime, 'DD-MM-YYYY hh:mm:ss A').utcOffset(0, false),
        'seconds',
    );

var hours = Math.floor(TotalSeconds / 3600);
var minutes = Math.floor((TotalSeconds / 60) % 60);
console.log(
    'startShiftTime: ',
    startShiftTime,
    ' endShiftTime: ',
    endShiftTime,
    ' hours: ',
    hours,
    ' minutes: ',
    minutes,
);

除了时差为 1 小时或其他情况外,我在所有情况下都得到小时和分钟

控制台输出:

startShiftTime:  02-12-2021 09:00:00 AM  endShiftTime:  01-12-2021 09:30:00 PM  hours:  11  minutes:  30
startShiftTime:  02-12-2021 04:30:00 PM  endShiftTime:  02-12-2021 05:00:00 PM  hours:  -1  minutes:  -30

在第二个输出中看到...时差只有 30 分钟..但在几小时内我得到的是 1

我无法理解我哪里出错了

你不需要自己做那些计算,但你可以使用 moment.duration API:

const startShiftTime = moment('01-12-2021 09:00:00 AM', 'DD-MM-YYYY hh:mm:ss A');
const endShiftTime = moment('01-12-2021 09:30:00 AM', 'DD-MM-YYYY hh:mm:ss A');

const duration = moment.duration(startShiftTime.diff(endShiftTime));

console.log('as hours: ' + duration.asHours(), 'as minutes: ' + duration.asMinutes());
console.log('hours: ' + duration.hours(), 'minutes: ' + duration.minutes());
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>

PS:您得到负值,因为差异是在开始时间完成的,该时间小于结束时间。如果你想要正值,那么你只需反转差异:endShiftTime.diff(startShiftTime)

为什么 startShiftTimeendShiftTime 格式化字符串而不是 moment 的实例。你最终会在稍后再次解析它们。

您计算的时间差应该是错误的。

endShiftTime
    .diff(startShiftTime,'seconds')

这就引出了一个明显的问题,为什么第一个示例计算正确...因为结束班次时间早于开始时间,所以这没有任何意义。

交换第一个示例中的开始时间和结束时间,然后在两个示例中都会得出正确答案。

function calculate(StartTime, EndTime) {

  let startShiftTime = moment(StartTime, ['DD-MM-YYYY h:mm:ss A'])
    .utcOffset(0, false);

  let endShiftTime = moment(EndTime, ['DD-MM-YYYY h:mm:ss A'])
    .utcOffset(0, false);

  var TotalSeconds = endShiftTime
    .diff(startShiftTime,'seconds');
    
  var hours = Math.floor(TotalSeconds / 3600);
  var minutes = Math.floor((TotalSeconds / 60) % 60);
  console.log(`startShiftTime: ${startShiftTime.format('DD-MM-YYYY h:mm:ss A')} endShiftTime: ${endShiftTime.format('DD-MM-YYYY h:mm:ss A')} hours: ${hours} minutes: ${minutes}`);
}

calculate('01-12-2021 09:30:00 PM', '02-12-2021 09:00:00 AM');
calculate('02-12-2021 04:30:00 PM', '02-12-2021 05:00:00 PM');
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>