【问题标题】:How to work out total duration between 2 timestamp? Javascript如何计算两个时间戳之间的总持续时间? Javascript
【发布时间】:2021-01-03 08:45:27
【问题描述】:

我有一个这样的数组,

[
 {id: 1, name: "sleep", endTime: 1600261550535, startTime: 1600261541729}, // 9 sec
 {id: 2, name: "sleep", endTime: 1600261527833, startTime: 1600261522709}, // 5 sec 
 {id: 3, name: "sleep", endTime: 1600261496881, startTime: 1600261437616}, // 59 sec 
 {id: 4, name: "awake", endTime: 1600261427129, startTime: 1600261413596}, // 14 sec 
 {id: 5, name: "awake", endTime: 1600261403114, startTime: 1600261347569}, // 56 sec 
 {id: 6, name: "awake", endTime: 1600261337893, startTime: 1600261206497}, // 2 min 11 sec 
]

当所有具有相同name 的对象加在一起时,我需要计算总时间(持续时间)。时间格式应为小时、分钟、秒。 显然,一次获取其中一个的持续时间很容易,但我想不出一种方法可以将持续时间加在一起。

非常感谢您的帮助。谢谢。随意使用 moment 或 lodash

输出应该是

total duration sleep : 1 min 13 secs
total duration awake : 3 min 21 secs

编辑:非常感谢大家的回复,你们让社区变得更好。

【问题讨论】:

  • 到目前为止你尝试了什么?
  • 这能回答你的问题吗? JavaScript - Get minutes between two dates
  • @NikNik 我能够得到两个日期之间的时间差,但我还没有弄清楚如何将它们加在一起以获得总持续时间。请查看我的数组和预期输出
  • 这很清楚,但您能展示一下您尝试过但对您不起作用的代码吗?也许您只需要按名称对单个结果进行分组,然后就完成了。

标签: javascript arrays object time timestamp


【解决方案1】:
let sleepResult = 0;
let awakeResult = 0;
array.forEach(item => {
  const diff = item.endTime - item.startTime
  if (item.name === 'sleep')
    sleepResult += diff
  if (item.name === 'awake')
    awakeResult += diff
})
console.log(`total duration sleep : ${sleepResult}`)
console.log(`total duration awake : ${awakeResult}`)

这将使您实现您的要求。

假设您将最终日志格式化为

1 分 13 秒

因为sleepResultawakeResult 是时间戳

【讨论】:

    【解决方案2】:

    这对我有用:

    let res = [
      {id: 1, name: "sleep", endTime: 1600261550535, startTime: 1600261541729}, // 9 sec
      {id: 2, name: "sleep", endTime: 1600261527833, startTime: 1600261522709}, // 5 sec 
      {id: 3, name: "sleep", endTime: 1600261496881, startTime: 1600261437616}, // 59 sec 
      {id: 4, name: "awake", endTime: 1600261427129, startTime: 1600261413596}, // 14 sec 
      {id: 5, name: "awake", endTime: 1600261403114, startTime: 1600261347569}, // 56 sec 
      {id: 6, name: "awake", endTime: 1600261337893, startTime: 1600261206497}, // 2 min 11 sec 
    ];
    // accumulate the differences in milliseconds
    res = res.reduce((a, e) => {
      a[e.name] = (a[e.name] || 0) + Math.abs(e.endTime - e.startTime);
      return a;
    }, {})
    
    // print the output extracting minutes and seconds
    Object.entries(res).map(([k, v]) => {
      let minutes = Math.floor(v / 60000);
      let seconds = Math.floor((v - minutes * 60000) / 1000)
      console.log(`${k} : ${minutes} minutes and ${seconds}`)
    })

    【讨论】:

      【解决方案3】:

      您可以使用reduce 将基于name 的对象累积到Map 中。执行累加/求和后,您可以在 Map 上使用 Array.from 和映射功能,将地图的值转换为所需的格式。然后,您可以 forEach/循环遍历地图的条目并打印出键/值:

      const arr = [ {id: 1, name: "sleep", endTime: 1600261550535, startTime: 1600261541729}, {id: 2, name: "sleep", endTime: 1600261527833, startTime: 1600261522709}, {id: 3, name: "sleep", endTime: 1600261496881, startTime: 1600261437616}, {id: 4, name: "awake", endTime: 1600261427129, startTime: 1600261413596}, {id: 5, name: "awake", endTime: 1600261403114, startTime: 1600261347569}, {id: 6, name: "awake", endTime: 1600261337893, startTime: 1600261206497}];
      
      const ppTime = s => {
        const hours = Math.floor(s / 3600);
        const min = Math.floor(s / 60) % 60
        const secs = s % 60;
        return [[hours, 'hours'], [min, 'min'], [secs, 'secs']].filter(([f]) => f).map(arr => arr.join(' ')).join(' ');
      }
      
      const res = Array.from(arr.reduce((m, {name, endTime, startTime}) => {
        return m.set(name, (m.get(name) || 0) + (endTime - startTime));
      }, new Map), ([k, v]) => [k, ppTime(Math.round(v/1000))]);
      
      res.forEach(([name, time]) => {
        console.log(`total duration ${name} : ${time}`);
      });

      【讨论】:

        【解决方案4】:

        试试这个:

        var timeStamps = [
         {id: 1, name: "sleep", endTime: 1600261550535, startTime: 1600261541729}, // 9 sec
         {id: 2, name: "sleep", endTime: 1600261527833, startTime: 1600261522709}, // 5 sec 
         {id: 3, name: "sleep", endTime: 1600261496881, startTime: 1600261437616}, // 59 sec 
         {id: 4, name: "awake", endTime: 1600261427129, startTime: 1600261413596}, // 14 sec 
         {id: 5, name: "awake", endTime: 1600261403114, startTime: 1600261347569}, // 56 sec 
         {id: 6, name: "awake", endTime: 1600261337893, startTime: 1600261206497}, // 2 min 11 sec 
        ];
        var sleep = 0;
        var awake = 0;
        timeStamps.forEach((element) => {
            if(element.name == "sleep") {
                sleep = sleep + element.endTime-element.startTime;}
            if(element.name == "awake") {
                awake = awake + element.endTime-element.startTime;}});
        var date = new Date(sleep);
        var date1 = new Date(awake);
        var sleepMinutes = date.getMinutes();
        var sleepSeconds = date.getSeconds();
        var awakeMinutes = date1.getMinutes();
        var awakeSeconds = date1.getSeconds();
        
        console.log("total amount of sleep: %s min %s sec",sleepMinutes, sleepSeconds);
        console.log("total amount of awake: %s min %s sec",awakeMinutes, awakeSeconds);
        

        【讨论】:

          【解决方案5】:

          这是一个有趣的代码挑战。我希望它可以帮助您实现最终目标。

          const getSleepAndDuration = (array) => {
              const finalTimesInSeconds = array.reduce(
                  (accum, current) => {
                      const start = moment(current.startTime);
                      const end = moment(current.endTime);
          
                      const diffInSeconds = end.diff(start, "seconds");
                      accum[current.name] += diffInSeconds;
                      return accum;
                  },
                  {
                      sleep: 0,
                      awake: 0,
                  }
              );
          
              const { sleep, awake } = finalTimesInSeconds;
              const sleepText = getDurationText(sleep);
              const awakeText = getDurationText(awake);
              console.log(`total duration sleep: ${sleepText}`);
              console.log(`total duration awake: ${awakeText}`);
          };
          
          
          const getDurationText = (duration) => {
              const days = Math.floor(duration / 86400);
              const hours = Math.floor((duration - days * 86400) / 3600);
              const minutes = Math.floor((duration - days * 86400 - hours * 3600) / 60);
              const seconds = Math.floor(
                  duration - days * 86400 - hours * 3600 - minutes * 60
              );
          
              let time = "";
              if (days) {
                  time += `${days} ${days === 1 ? "day" : "days"}`;
              }
              if (hours) {
                  time += ` ${hours} ${hours === 1 ? "hour" : "hours"}`;
              }
              if (minutes) {
                  time += ` ${minutes} ${minutes === 1 ? "minute" : "minutes"}`;
              }
              if (seconds) {
                  time += ` ${seconds} ${seconds === 1 ? "second" : "seconds"}`;
              }
              return time;
          };
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-03-30
            • 1970-01-01
            • 2020-06-28
            • 2014-02-28
            • 1970-01-01
            • 1970-01-01
            • 2020-07-17
            相关资源
            最近更新 更多