计算 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)
为什么 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');
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>
我正在尝试计算两个不同日期和时间的总小时数和分钟数:
下面是我的代码:
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)
为什么 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');
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>