#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;