расчет часов между двумя датами и временем в javascript

#javascript #react-native #datetime #momentjs

#язык 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

Я не в состоянии понять, где я совершаю ошибку

Ответ №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()); 
 lt;script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"gt;lt;/scriptgt; 

PS: Вы получаете отрицательные значения, потому что разница определяется временем начала, которое меньше времени окончания. Если вам нужны положительные значения, то вы просто инвертируете разницу: endShiftTime.diff(startShiftTime)

Ответ №2:

Почему являются startShiftTime и endShiftTime форматированными строками вместо экземпляров 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'); 
 lt;script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"gt;lt;/scriptgt;