朋友,
我有一个包含签到和签出时间的数组,需要计算这些操作之间的花费时间。为此,我在两个独立的数组中遍历此表分区签到校验,例如:
var checkins = [];
var checkouts = [];
var results = [];
var index;
for (index = 0; index < $scope.data.registries.length; ++index){
if ($scope.data.registries[index].rType == 0) {
checkins.push(moment($scope.data.registries[index].savedHour, "HH:mm:ss"));
}
else {
checkouts.push(moment($scope.data.registries[index].savedHour, "HH:mm:ss"));
}
}
之后我只是迭代checkins数组,计算差异并将其推入结果数组,如下所示:
for (index = 0; index < checkins.length; ++index){
if (index <= checkouts.length) {
results.push(moment.utc(checkouts[index]).diff(moment(checkins[index])));
}
}
所以,现在我有一个只包含差异时间的数组,用于每对签到结账。我只是 总结一下这些差异...就像这样:
var total = null;
for (index = 0; index < results.length; ++index) {
if (index == 0){
total = moment(results[index]);
}
else{
total.add(results[index]);
}
}
if (results.length == 0) {
return "00 hour(s) and 00 minute(s)";
}
else {
return moment.utc(total).format("HH [ hour(s) and ] mm [ minute(s)]");
}
我没有得到正确的时间....以下示例数据:
检查07:32 结帐07:34 - &gt; 差异:2分钟签到08:20 结账08:53 - &gt; 差异:33分钟
我应该总共35分钟,但是 它总是根据当前时间变化...例如,现在这里是10:51(am) 这个函数返回2h和37m
我看不出有什么问题......有人能说出来吗?
答案 0 :(得分:3)
一些事情:
您在当地时间减去UTC:
moment.utc(checkouts[index]).diff(moment(checkins[index]))
^^^^^^^^^^ ^^^^^^
两个值都应该是UTC,或者两个值都应该是本地的。
您说您的输入是仅限时间的值。请注意,如果您未指定日期,则会假定当前日期。如果您在daylight saving time转换的当天与当地时间合作,则可能会将结果调整最多一个小时。如果您打算在当天工作并希望准确的经过时间,那么这应该是预期的。否则,您需要将时间安排到特定日期。
您并未考虑跨越午夜的时间范围,例如22:00至02:00应为4小时(大多数日子)。您应检查值是否按顺序排列,如果没有,则在结帐时添加一天。
答案 1 :(得分:1)
我在Chrome控制台中做了一个简短的示例,并通过以下方式得到了正确答案:
var start = moment('07:32', "HH:mm:ss")
var stop = moment('07:34', "HH:mm:ss")
var diff1 = moment.utc(stop).diff(moment(start))
start = moment("08:03", "HH:mm:ss")
stop = moment("08:33", "HH:mm:ss")
var diff2 = moment.utc(stop).diff(moment(start))
var total = moment(diff1)
total.add(diff2)
moment.utc(total).format("HH [ hour(s) and ] mm [ minute(s)]");
"00 hour(s) and 32 minute(s)"
所以看起来你的逻辑是正确的,没有数组和for循环。
答案 2 :(得分:0)
朋友......我的循环中的逻辑问题hehehheh
我正在使用
for (index = 0; index < checkins.length; ++index){
if (index <= checkouts.length) {
results.push(moment.utc(checkouts[index]).diff(moment(checkins[index])));
}
}
正确的是
for (index = 0; index < checkins.length; ++index){
if (index <= checkouts.length-1) {
results.push(moment.utc(checkouts[index]).diff(moment(checkins[index])));
}
}