使用moment.js计算时差

时间:2014-10-22 12:57:02

标签: momentjs

朋友,

我有一个包含签到和签出时间的数组,需要计算这些操作之间的花费时间。为此,我在两个独立的数组中遍历此表分区签到校验,例如:

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

我看不出有什么问题......有人能说出来吗?

3 个答案:

答案 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]))); 
   }
}