如何在JavaScript中按天拆分Unix时间戳计算每日使用时长?
问题描述
我从客户端获取了两个Unix时间戳:
const orgStartTime = 1603801800; // Tue Oct 27 2020 23:00:00 GMT+1030 (澳大利亚中部夏令时) const orgEndTime = 1603807200; // Wed Oct 28 2020 00:30:00 GMT+1030 (澳大利亚中部夏令时)
需要按天拆分计算使用时长:将跨天的时间段拆分为对应每一天的使用片段,记录当天的开始/结束时间戳及使用分钟数。例如上述示例中,orgStartTime所在的10月27日当天剩余1小时(需关联日期“Tue Oct 27 2020”),剩余时长计入次日。期望输出格式如下:
1. StrtTime = 1603801800; EndTime = 1603805400; usageTime: 60(minutes) 2. StrtTime = 1603805400; EndTime = 1603807200; usageTime: 30(minutes)
注:若时间段间隔2天(例如从27日到29日),需生成3组开始/结束时间(覆盖27、28、29三天)。可类比屏幕时间统计场景,允许使用任意第三方库实现。
解决方案
推荐使用moment-timezone处理时区相关的日期计算,确保拆分逻辑符合指定时区的日期边界:
实现代码
const moment = require('moment-timezone'); // 配置目标时区(对应GMT+1030夏令时) const TIMEZONE = 'Australia/Adelaide'; function splitUsageByDay(startTimestamp, endTimestamp) { const result = []; let currentDayStart = moment.unix(startTimestamp).tz(TIMEZONE).startOf('day'); const endDate = moment.unix(endTimestamp).tz(TIMEZONE); while (currentDayStart.isBefore(endDate)) { // 当天的结束时间(次日0点) const currentDayEnd = currentDayStart.clone().add(1, 'day').startOf('day'); // 计算当天实际的开始/结束时间戳 const segmentStart = Math.max(startTimestamp, currentDayStart.unix()); const segmentEnd = Math.min(endTimestamp, currentDayEnd.unix()); // 计算使用分钟数 const usageMinutes = Math.floor((segmentEnd - segmentStart) / 60); // 记录当天日期字符串 const dateStr = currentDayStart.format('ddd MMM DD YYYY'); result.push({ date: dateStr, StrtTime: segmentStart, EndTime: segmentEnd, usageTime: `${usageMinutes}(minutes)` }); // 推进到下一天 currentDayStart = currentDayEnd; } return result; } // 测试示例 const orgStartTime = 1603801800; const orgEndTime = 1603807200; const usageSegments = splitUsageByDay(orgStartTime, orgEndTime); // 按要求格式输出 usageSegments.forEach((seg, index) => { console.log(`${index + 1}. StrtTime = ${seg.StrtTime};`); console.log(` EndTime = ${seg.EndTime};`); console.log(` usageTime: ${seg.usageTime}`); console.log(` date: ${seg.date}`); });
代码说明
- 时区处理:通过
moment-timezone指定目标时区,确保日期边界(当天0点/次日0点)符合用户所在时区的规则。 - 循环拆分:从开始时间所在的日期开始,逐天计算当天的时间片段,直到覆盖结束日期。
- 边界计算:对每一天,取原时间段与当天时间范围的交集,得到该天实际的使用起止时间。
- 时长计算:将时间戳差值转换为分钟数,完成统计。
跨多天示例
若输入时间段为start: 1603801800(2020-10-27)、end: 1603974600(2020-10-29 00:30),函数会生成3组数据,分别对应27日、28日、29日的使用片段。
内容的提问来源于stack exchange,提问作者Yun
相关产品推荐
相关产品推荐

