信息发布→ 登录 注册 退出

如何统计日期列表中的天数、周末数与月份数

发布时间:2025-12-27

点击量:

本文介绍如何使用 javascript 快速统计一个 iso 格式日期字符串数组中包含的总天数、周末天数(周六/周日)以及作为每月首日的日期数量,并输出结构化结果对象。

在处理时间序列数据(如日志记录、用户活跃度、排班表等)时,常需从一串日期中提取高频统计维度:总天数周末天数(Saturday/Sunday)、月份数(即该列表中有多少个日期落在当月第一天)。这类需求无需引入大型时间库(如 date-fns 或 moment),纯原生 JavaScript 即可高效完成。

✅ 核心逻辑说明

  • 总天数(day):直接取数组长度,前提是每个元素代表一个独立日期(无重复或无效项);
  • 周末天数(weekend):利用 Date.prototype.getDay() 判断星期几——返回值 0(周日)和 6(周六)即为周末;
  • 月份数(month):检查 Date.prototype.getDate() 是否等于 1,即是否为每月第 1 天(注意:此处统计的是“出现在列表中的月份数”,非跨月总数;若同月有多个 1 号,将被重复计数)。
⚠️ 注意:getDay() 返回的是星期索引(0=Sunday, 1=Monday…6=Saturday),而非日期序号;getDate() 才是当月第几天。

? 推荐实现(简洁、可读、健壮)

以下代码采用函数式风格,使用 filter() + 箭头函数,兼顾性能与可维护性:

function analyzeDateList(dateList) {
  const dayCount = dateList.length;

  const weekendCount = dateList.filter(str => {
    const d = new Date(str);
    return d.getDay() === 0 || d.getDay() === 6; // Sunday or Saturday
  }).length;

  const monthCount = dateList.filter(str => {
    const d = new Date(str);
    return d.getDate() === 1;
  }).length;

  return { day: dayCount, weekend: weekendCount, month: monthCount };
}

// 示例调用
const dates = [
  "2025-01-31T23:00:00.000Z",
  "2025-02-01T23:00:00.000Z",
  "2025-02-02T23:00:00.000Z",
  "2025-02-03T23:00:00.000Z",
  "2025-02-04T23:00:00.000Z", // Saturday → weekend
  "2025-03-01T23:00:00.000Z", // March 1st → month
];

console.log(analyzeDateList(dates));
// 输出:{ day: 6, weekend: 1, month: 2 }

? 进阶提示

  • 时区安全:输入为 ISO 8601 UTC 字符串(含 Z),new Date(str) 会正确解析为 UTC 时间,避免本地时区偏移干扰;
  • 错误处理(可选增强):生产环境建议添加校验,过滤非法日期:
    const isValidDate = (str) => !isNaN(new Date(str).getTime());
    const validDates = dateList.filter(isValidDate);
  • 去重月份数(如需统计“涉及多少不同月份”):改用 Set 提取唯一年月组合:
    const uniqueMonths = new Set(
      dateList.map(d => new Date(d).toISOString().slice(0, 7)) // "YYYY-MM"
    ).size;

✅ 总结

三行 filter 即可完成核心统计,无需依赖外部库。关键在于明确业务语义:

  • "month" 指 列表中作为每月首日出现的次数(非“覆盖几个月”);
  • "weekend" 是 周末日期的数量,非周末“周数”;
  • 所有计算均基于标准 Date API,兼容所有现代浏览器与 Node.js 环境。

按需封装为函数后,可轻松集成至数据分析管道或前端仪表盘中。

标签:# javascript  # java  # js  # 前端  # node.js  # node  # 浏览器  # 字符串数组  # yy  
在线客服
服务热线

服务热线

4008888355

微信咨询
二维码
返回顶部
×二维码

截屏,微信识别二维码

打开微信

微信号已复制,请打开微信添加咨询详情!