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

为什么dayjs的isBefore方法运行不符合预期,相同代码在momentjs中正常

问题原因

核心差异是 momentjs 和 dayjs 的对象可变性设计不同:

  • momentjs 的 add 方法是可变操作,调用后会直接修改原 moment 对象的值
  • dayjs 的所有日期操作方法都是不可变操作,调用后只会返回新的 dayjs 实例,原实例的值不会发生任何改变

你的代码中,day 变量在 while 循环内从未被重新赋值,永远等于初始的 startDay.clone().subtract(1, 'day'),所以 day.isBefore(endDay, 'day') 判断永远为 true,进入无限循环,不断往 calendar 数组插入数据最终导致内存溢出。
同时当前的 map 逻辑在 dayjs 下也无法生成正确的一周日期:每次 day.add(1, 'day') 都基于初始的 day 计算,最终生成的7个日期都是同一天。

解决方法

调整循环逻辑,每次修改日期后主动更新 day 变量即可,修改后代码参考:

import dayjs from 'dayjs';

const calendar = [];
const today = dayjs();
const startDay = today.clone().startOf('month').startOf('week');
const endDay = today.clone().endOf('month').endOf('week');

let day = startDay.clone().subtract(1, 'day');

while (day.isBefore(endDay, 'day')) {
  const week = []
  for (let i = 0; i < 7; i++) {
    // 主动更新day变量为add后的新实例
    day = day.add(1, 'day')
    week.push(day.clone())
  }
  calendar.push(week)
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 10:51:02