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

使用Moment.js获取周六至周日日期范围时遇赋值异常问题

Moment.js 日期赋值后两个变量值一致的问题

你猜测的完全没错——Moment.js的add()、subtract()这类方法是原地修改调用它的对象的,不是返回新对象。所以你执行endDate = startDate.add(7, 'd')时,先把startDate本身改成了加7天后的日期,然后endDate只是指向了同一个Moment对象,最后两个变量自然一模一样。

以你说的2024年11月1日为例:

  1. 处理后startDate是10月26日(上周六)
  2. 调用startDate.add(7, 'd')时,startDate直接变成11月2日
  3. endDate接收的是修改后的startDate的引用,所以两者都是11月2日

解决方法

要避免这个问题,需要先克隆startDate再修改,Moment.js提供了clone()方法:

var today = moment(new Date());

var startDate;
var endDate;

var weekStart = today.subtract(7, 'd'); // 7 days ago

if (weekStart.day() === 6 ){ // Saturday
    startDate = weekStart;
}
else{
    startDate = weekStart.clone().day(6);
}
// 先克隆startDate,再对克隆后的对象执行add操作
endDate = startDate.clone().add(7, 'd');

额外补充:weekStart.day(6)其实也是原地修改weekStart的操作,如果你后续还要用到原始的weekStart值,上面的代码里已经给这一步加上了clone(),避免意外修改原对象。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 19:29:51