我有一个方法,它接受一个以时间作为输入的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 时间时,所有三个值都是相同的,"星期二 Jun 26 2018 09:58:00 GMT-0400"。 加减会议纪要声明没有影响。
我在这里错过了什么或做错了什么?
请注意,add()
和subtract
都会改变原始时刻。
add()
:
通过添加时间来改变原始时刻。
subtract
:
通过减去时间来改变原始时刻。
所以你必须使用clone()
此外,在最新版本的moment中,第一个参数是加/减的时间量,第二个参数是表示要添加的时间键的字符串
add
和subtract
首先需要时间量,然后是哪种类型的时间,如此处所述。还要确保为每个计算创建一个新的矩对象,因为它会改变矩对象。
let preTime = moment(myMoment).subtract(30, 'm');
let postTime = moment(myMoment).add(30, 'm');
你一直在处理同一个时刻对象,因此你在做let localeTime = myDate.toLocaleString()
的时候就有了原始的时刻对象。
您只需要创建一个新的时刻对象,这样您就不会还原更改。
...
// create range values
let preTime = moment(myMoment).subtract('m', 30);
let postTime = moment(myMoment).add('m', 30);
...
我认为您需要使用的是从现在开始使用 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
我认为这应该会有所帮助。