如何计算两个时间戳之间的总持续时间? JavaScript

时间:2020-09-16 13:43:34

标签: javascript arrays object time timestamp

我有一个像这样的数组,

[
 {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的对象加在一起时,我需要计算总时间(持续时间)。时间格式应为hr,min,sec。 显然,一次获取其中一个的持续时间很容易,但是我想不出一种加在一起的持续时间的方法。

非常感谢您的帮助。谢谢。随时使用一下时刻或lodash

输出应为

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

编辑:非常感谢您的答复,你们是使社区变得更好的原因。

5 个答案:

答案 0 :(得分: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是时间戳记

答案 1 :(得分:1)

这对我有用:

someone.name@g

答案 2 :(得分:1)

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

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}`);
});

答案 3 :(得分:1)

尝试一下:

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);

答案 4 :(得分:1)

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

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;
};