
本文介绍如何使用 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 = [
"2023-01-31T23:00:00.000Z",
"2023-02-01T23:00:00.000Z",
"2023-02-02T23:00:00.000Z",
"2023-02-03T23:00:00.000Z",
"2023-02-04T23:00:00.000Z", // Saturday → weekend
"2023-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 环境。
按需封装为函数后,可轻松集成至数据分析管道或前端仪表盘中。










