本文介绍如何使用 javascript 快速统计一个 iso 格式日期字符串数组中包含的总天数、周末天数(周六/周日)以及作为每月首日的日期数量,并输出结构化结果对象。
在处理时间序列数据(如日志记录、用户活跃度、排班表等)时,常需从一串日期
中提取高频统计维度:总天数、周末天数(Saturday/Sunday)、月份数(即该列表中有多少个日期落在当月第一天)。这类需求无需引入大型时间库(如 date-fns 或 moment),纯原生 JavaScript 即可高效完成。
⚠️ 注意: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 }const isValidDate = (str) => !isNaN(new Date(str).getTime()); const validDates = dateList.filter(isValidDate);
const uniqueMonths = new Set( dateList.map(d => new Date(d).toISOString().slice(0, 7)) // "YYYY-MM" ).size;
三行 filter 即可完成核心统计,无需依赖外部库。关键在于明确业务语义:
按需封装为函数后,可轻松集成至数据分析管道或前端仪表盘中。