【问题标题】:Days are not added properly with momentJS in JavaScript使用 JavaScript 中的 momentJS 未正确添加天数
【发布时间】:2015-04-23 02:24:46
【问题描述】:

我有这个代码,我想从开始日期开始的接下来的 15 天获得此代码

    var fortnightStart = moment("15 04 2015", "DD MM YYYY");

    for (var i = 1; i <= 15; i++) {

        dates.push(fortnightStart.add(i, "days").format("D MMM"));

    }

    console.log(dates);

这是输出

["16 Apr", "18 Apr", "21 Apr", "25 Apr", "30 Apr", "6 May", "13 May", "21 May", "30 May", "9 Jun", "20 Jun", "2 Jul", "15 Jul", "29 Jul", "13 Aug"]

不知道为什么几天不见。

【问题讨论】:

  • .add() 函数修改时刻(日期)对象。

标签: javascript date momentjs


【解决方案1】:

在每次迭代中,您都会在初始日期中添加 i 天 - 因此它会不断累积(+1、+2、+3 等)。您不需要将i 添加到fortnightStart,而只需将1 添加到fortnightStart

var fortnightStart = moment("15 04 2015", "DD MM YYYY");
for (var i = 1; i <= 15; i++) {
    // 1, not i
    dates.push(fortnightStart.add(1, "days").format("D MMM"));
}
console.log(dates);

【讨论】:

  • 这行得通,但正如其他人指出的那样,您需要知道.add() 正在改变基准日期。此循环起作用的唯一原因是您将格式化的字符串推送到日期数组中,而不是实际时刻。如果你放弃.format(),你最终会得到一个包含许多对同一时刻的引用的数组。
  • @SMcCrohan 完全同意你的看法。另一种选择是在添加日期之前创建新的日期对象或克隆fortnightStart
【解决方案2】:

问题在于.add 修改了传入的对象,而不是创建新日期。为了使您的代码保持其原始样式,您需要在添加之前clone the date

dates.push(fortnightStart.clone().add(i, "days").format("D MMM"));

或者:

dates.push(moment(fortnightStart).add(i, "days").format("D MMM"));

【讨论】:

    【解决方案3】:

    您缺少日期的原因是“date.add”更改了当前变量。例如

    date = moment("15 04 2015", "DD MM YYYY");
    date.add(1, "days");
    console.log(date); // This will give you "16 04 2015"
    

    为了让您的代码正常工作,您需要确保:

    1) 'add' 方法不会通过添加到克隆来更改您的原始值。例如

    dates.push(fortnightStart.clone().add(i, "days").format("D MMM"));
    

    2) 如果“i”天,则每个循环只添加 1 天。例如

    dates.push(fortnightStart.clone().add(1, "days").format("D MMM"));
    

    【讨论】:

      猜你喜欢
      • 2017-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多