【问题标题】:Moment not adding minutes to object created from javascript Date时刻不向从 javascript 日期创建的对象添加分钟
【发布时间】:2018-06-26 15:49:30
【问题描述】:

我有一个方法可以接受带有时间的 javascript 日期作为输入,并确定当前日期和时间是否在 -30 分钟内。但是,当我在运行时调试它时,moment.add 似乎没有按预期使用分钟。

function isWithinRange(myDate: Date){
    // convert to Moment obj
    let myMoment = moment(myDate);
    let todayMoment = moment(new Date());

    let myMomentOk = myMoment.isValid();
    let todayOk = todayMoment.isValid();

    // create range values
    let preTime = myMoment.subtract('m', 30);
    let postTime = myMoment.add('m', 30);

    //check values are as expected
    let localeTime = myDate.toLocaleString();]
    let preLocale = preTime.toLocaleString();
    let postLocale = postTime.toLocaleString();

    let result = todayMoment.isBetween(preTime, postTime);
    return result;

}

但是当我在运行时检查 localeTime、preLocale 和 postLocale 时间时,所有三个值都是相同的,“Tue Jun 26 2018 09:58:00 GMT-0400”。加减分钟语句没有影响。

我在这里遗漏了什么或做错了什么?

【问题讨论】:

    标签: javascript momentjs


    【解决方案1】:

    请注意add()subtract 改变原始时刻

    add():

    通过增加时间来改变原始时刻。

    subtract:

    通过减去时间来改变原始时刻。

    所以你必须使用clone()

    此外,在最新版本的 moment 中,第一个参数是加/减的时间量,第二个参数是表示 您要添加的时间的键的字符串

    【讨论】:

    • 感谢所有回复。根本问题是我假设 add 会返回新值,而不是改变原始对象。它做了相反的事情。克隆或时刻(myMoment)是解决方案。
    【解决方案2】:

    addsubtract 先取时间量,再取什么类型的时间,如documented here。还要确保为每个计算创建一个新的矩对象,因为它会改变矩对象。

    let preTime = moment(myMoment).subtract(30, 'm');
    let postTime = moment(myMoment).add(30, 'm');
    

    【讨论】:

      【解决方案3】:

      您一直在处理同一个时刻对象,因此您在执行操作时拥有原始时刻对象let localeTime = myDate.toLocaleString()

      您只需要创建一个新的时刻对象,这样您就不会恢复您的更改。

      ...
      // create range values
      let preTime = moment(myMoment).subtract('m', 30);
      let postTime = moment(myMoment).add('m', 30);
      ...
      

      【讨论】:

        【解决方案4】:

        我认为你现在需要使用的是https://momentjs.com/docs/#/query/is-between/isBetween方法。

        const testDate = moment()
        testDate.isBetween(moment().subtract(30, 'm'), moment().add(30, 'm'))
        // true
        
        const testDate = moment().add(2, 'h');
        testDate.isBetween(moment().subtract(30, 'm'), moment().add(30, 'm'))
        // false
        

        我认为这应该会有所帮助。

        【讨论】:

          猜你喜欢
          • 2011-12-23
          • 1970-01-01
          • 2019-04-19
          • 1970-01-01
          • 1970-01-01
          • 2019-01-21
          • 1970-01-01
          • 2011-10-07
          • 1970-01-01
          相关资源
          最近更新 更多