【问题标题】:How to sum time string in an array?如何对数组中的时间字符串求和?
【发布时间】:2019-06-16 19:16:35
【问题描述】:

假设,我有一个不同时间字符串的数组。

let a: any = ["7:20", "5:50", "6:30"];

我想总结一下这些 HH:mm 时间字符串。我正在使用 Ionic 4 (Angular) 构建一个应用程序。我已经为这些使用了 momentjs。但是,不幸的是,我找不到任何解决方案。

更新: 预期结果: 7:20 + 5:50 + 6:30 = 19:40 (HH:33)

【问题讨论】:

  • 你期待的结果是什么?
  • 你到底想要什么结果?
  • @Praveen 我期待,总小时:19:40 (HH:mm)
  • 为什么moment("7:20", "H:mm") 不能工作?
  • @sunielkalwani 7:20 + 5:50 + 6:30 = 19:40(总小时数)

标签: javascript angular ionic-framework


【解决方案1】:

您可以将时间视为可以总结的moment durations

const any = ['7:20', '7:52', '5:03', '1:01', '9:02', '6:00'];

const sum = any.reduce((acc, time) => acc.add(moment.duration(time)), moment.duration());

console.log([Math.floor(sum.asHours()), sum.minutes()].join(':'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.23.0/moment.min.js"></script>

【讨论】:

  • 我从 console.log(sum.asHours()) 得到正确的结果;但是当我将 Hours 转换为 HH:mm 时,结果不是预期的!我的示例输入时间:7:20 + 7:52 + 5:03 + 1:01 + 9:02 + 6:00 = 36:18。但它显示 12:18 是错误的。
  • 您能否指定如何执行从持续时间到“HH:mm”格式的转换?您是否尝试从更新的答案中接近(这意味着分别获取小时和分钟,然后加入它们)?
  • 是的,我只是在使用您更新的代码。您可以使用我上面的评论示例输入来检查它吗?我想你能理解。
  • @AbhijitM.Abhi 很抱歉造成混淆,我明白了您的意思并更新了使用绝对小时数的答案,请看一下。
  • 正是我期望你用几行代码完成的正确答案。快乐编码!
【解决方案2】:

你可以通过传递一个回调函数来使用reduce方法。

let arr= ["7:20", "5:50", "6:30"];
toSeconds = (str) => {
   str = str.split(':');
   return (+str[0]) * 60 + (+str[1]);  
}

toHHss = (seconds) => {
   let minutes = parseInt(seconds/60);
   seconds = seconds - minutes*60;
   return minutes + ':' + seconds;
}
let result = arr.reduce((r,elem) => r + toSeconds(elem), 0);
console.log(toHHss(result));

【讨论】:

  • toHHss 函数没有正确格式化分钟,它产生 H:m 而 OP 似乎想要 H:mm。 seconds 参数应该命名为 minutes。 :-)
  • @RobG, result 将保留我们求和后的总秒数。然后我只是将秒转换为 HH:MM 格式
【解决方案3】:

原版 Javascript 实现:

const secondsToHm = s => ({
  hours: ((s - s % 3600) / 3600) % 60, 
  minutes: ((s - s % 60) / 60) % 60, 
})

let a = ["7:20", "5:50", "6:30"];
let total = 0; 

for(let i = 0; i < a.length; i++){
  const aSlice = a[i].split(':');
  const aSeconds = (+aSlice[0]) * 60 * 60 + (+aSlice[1]) * 60;
  total += aSeconds
}

console.log(`${secondsToHm(total).hours}:${secondsToHm(total).minutes}`);

【讨论】:

    【解决方案4】:

    POJS 解决方案可以非常简单:

    /* Add array of time strings in H:mm format
    ** @param {Array<string>} timeArray - Array of H:mm
    ** @returns {string} - sum of times in H:mm format
    */
    function addTimes(timeArray) {
      let mins = timeArray.reduce((acc, time) => {
        let [h, m] = time.split(':');
        acc += h*60 + m*1;
        return acc;
      }, 0);
      return (mins/60|0) + ':' + ('0'+(mins%60)).slice(-2);
    }
    
    // Example
    console.log(addTimes(["7:20", "5:03", "6:42"]));

    【讨论】:

      【解决方案5】:

      你可以使用 moment.duration() 来获取数组中每个时间字符串的毫秒数,并添加它们。

      a.reduce((acc, t) => acc.add(moment.duration(t)), moment.duration())
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-09
        • 1970-01-01
        • 2012-10-19
        • 1970-01-01
        • 2015-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多