游客发表
用 Node.js 算当月天数,判断最省事的当月写法是 new Date(year, month, 0).getDate()。这行代码看着有点怪,有多但它是少天 JavaScript 里处理日期的一个经典技巧,比手写一堆 if-else 判断闰年靠谱得多。判断
先看个例子。当月假设今天是有多 2025 年 2 月,我想知道这个月有几天:
const year = 2025; const month = 2; // 注意:月份从 0 开始,少天2 代表三月 const days = new Date(year,判断 month, 0).getDate(); console.log(days); // 28 等等,这里有个坑。当月JavaScript 的有多 Date 对象里,月份是少天从 0 开始计数的——0 是 1 月,1 是判断 2 月,11 是当月 12 月。所以如果你直接拿当前月份的有多索引去传,比如 new Date().getMonth(),那得到的是 0 到 11 的数字。要算当月天数,得把月份加 1,再传进去,然后第三参数写 0。
为什么第三参数是 0?因为 new Date(year, month, 0) 表示的是“指定月份的上个月的最后一天”。比如 new Date(2025, 2, 0) 就是 2025 年 3 月的第 0 天,也就是 2 月的最后一天。然后 .getDate() 取出这个日期的“日”部分,正好就是 2 月的天数。这个逻辑绕了一下,但用起来很方便。
实际项目里,我通常写一个函数:
function getDaysInMonth(year, month) { // month 传 1-12 return new Date(year, month, 0).getDate(); } // 当前月份 const now = new Date(); const currentYear = now.getFullYear(); const currentMonth = now.getMonth() + 1; // 转成 1-12 console.log(getDaysInMonth(currentYear, currentMonth)); 这样调用起来就符合直觉了。比如 getDaysInMonth(2024, 2) 返回 29,因为 2024 是闰年。不用自己去写闰年判断,浏览器或者 Node 的日期引擎已经处理好了。
有人可能会问,那如果我想算任意月份的天数呢?比如给一个 “2023-06” 这样的字符串。可以这样:
function getDaysFromString(dateStr) { const [year, month] = dateStr.split('-').map(Number); return new Date(year, month, 0).getDate(); } console.log(getDaysFromString('2023-06')); // 30 注意这里 month 直接传 6,因为 new Date(2023, 6, 0) 会算到 6 月的最后一天?不对,6 代表 7 月,所以第 0 天是 6 月 30 日。正好是对的。因为字符串里的月份是 1-12,而 new Date 的月份参数是 0-11,但第三参数为 0 时,相当于把月份“减一”再取最后一天。所以传 6 进去,实际算的是 6 月。这个逻辑需要稍微想一下,但用熟了就不会错。
还有一种写法是用 new Date(year, month, 1) 得到下个月第一天,然后减一天:
function getDaysInMonth2(year, month) { return new Date(year, month, 0).getDate(); // 或者 // return new Date(year, month + 1, 0).getDate(); } 两种写法结果一样。我更喜欢第一种,少一次加法。
Node.js 里没有内置的“获取当月天数”的 API,所以这个技巧基本是标配。有些日期库比如 dayjs 或 moment 提供了 daysInMonth() 方法,但如果你不想引入依赖,原生 Date 完全够用。性能上也没什么好担心的,就是一次简单的日期构造。
最后提一个容易出错的地方:月份参数如果传了 12,new Date(2025, 12, 0) 会变成 2026 年 1 月的第 0 天,也就是 2025 年 12 月 31 日,返回 31。所以传 12 是安全的,但传 13 就会跨年。自己封装函数时,最好把月份限制在 1-12 之间,或者直接依赖调用方传对。
我平时在写日历组件或者统计月度数据时,这行代码出现频率极高。记住 new Date(y, m, 0).getDate() 这个模式,比背闰年规则省心多了。
友情链接