Steve Wash
Steve Wash

Reputation: 986

Moment not adding minutes to object created from javascript Date

I have a method that accepts a javascript date with time as input, and determines if the current date and time is within -30 mins. However, when I debug this at runtime, moment.add doesn't seem to be working with minutes as expected.

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;

}

But when I inspect the localeTime, preLocale and postLocale times at run time, all three values are the same, "Tue Jun 26 2018 09:58:00 GMT-0400". The add and subtract minutes statements had no impact.

What am I missing or doing wrong here?

Upvotes: 4

Views: 1009

Answers (4)

Sandip Nirmal
Sandip Nirmal

Reputation: 2459

I think what you need to use is https://momentjs.com/docs/#/query/is-between/ isBetween method from the moment.

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

I think this should help.

Upvotes: 0

Tholle
Tholle

Reputation: 112787

add and subtract takes the amount of time first, and then what type of time, as documented here. Also make sure to create a new moment object for each calculation, as it mutates the moment object.

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

Upvotes: 2

Batajus
Batajus

Reputation: 6257

You're working on the same moment object all the time, because of this you have the original moment object at the time you're doing let localeTime = myDate.toLocaleString().

You just need to create a new moment object so you don't revert your changes.

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

Upvotes: 0

VincenzoC
VincenzoC

Reputation: 31482

Please note that both add() and subtract mutate the original moment.

add():

Mutates the original moment by adding time.

subtract:

Mutates the original moment by subtracting time.

so you have to use clone()

Moreover, in the recent version of moment, the first argument is the amount of time to add/subtract and the second argument is the string that represent the key of what time you want to add

Upvotes: 4

Related Questions