You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

代码说明

  1. 时区处理:通过moment-timezone指定目标时区,确保日期边界(当天0点/次日0点)符合用户所在时区的规则。
  2. 循环拆分:从开始时间所在的日期开始,逐天计算当天的时间片段,直到覆盖结束日期。
  3. 边界计算:对每一天,取原时间段与当天时间范围的交集,得到该天实际的使用起止时间。
  4. 时长计算:将时间戳差值转换为分钟数,完成统计。

跨多天示例

若输入时间段为start: 1603801800(2020-10-27)、end: 1603974600(2020-10-29 00:30),函数会生成3组数据,分别对应27日、28日、29日的使用片段。


内容的提问来源于stack exchange,提问作者Yun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 05:40:21