简体   繁体   中英

How to check if the time is in between given range using moment.js?

I am using moment.js library for time.

I want to check if the time I am getting from the backend is in between 8AM to Noon (12PM). I want to store all the objects whose time is in between 8AM to 12PM.

I am getting date in this format - "2022-04-04T21:43:59Z" . I want to use timezone "America/Detroit" .

Here is what I have tried but this didn't work;

  //this code is inside forEach loop
  moment.tz.setDefault($scope.userData.account.timeZone);
  var format = 'hh:mm:ss'
  var time = moment(response.date,format),
  beforeTime = moment('08:00:00', format),
  afterTime = moment('11:59:59', format);
  if (time.isBetween(beforeTime, afterTime)) {
     console.log('is between')
  } else {
     console.log('is not between')
  }

In the output I am getting is not between for all the data but in real there is some data which is having date and time falling under 8am - 12pm. Is there anything wrong because of timezone?

The reason why your compare isn't working it's because it's not only using time but also the date.

You should first extrapolate the time from the input datetime and use that data to make the comparison like this:

let datetime = moment('2022-04-04T10:00:00Z', 'YYYY-MM-DDTHH:mm:ssZ');

moment({
  hour:datetime.hour(),
  minute:datetime.minute(),
  second:datetime.second()
}).isBetween(beforeTime, afterTime);
//returns bool true or false

That's because all those 3 datetimes will lay in the same solar day and only time will be relevant to the comparison.

Plus you incorrectly dealt with formats when parsing both your input datetimes and times used for before and after.

This is a working solution showing the concept:

 //those are the formats your input uses for datetimes and times const datetime_format = 'YYYY-MM-DDTHH:mm:ssZ'; const time_format = 'HH:mm:ss'; //this is your input crafted as objects having the prop date var response_timeYESInBetween = {date: "2022-04-04T10:00:00Z"}; var response_timeNOTInBetween = {date: "2022-04-04T21:43:59Z"}; //moment.tz.setDefault($scope.userData.account.timeZone); //this is where you parse those timestamp strings as moment datetime var datetime_YESInBetween = moment(response_timeYESInBetween.date, datetime_format); var datetime_NOTInBetween = moment(response_timeNOTInBetween.date, datetime_format); //this is where those moment datetime get used to create new datetimes holding those same time but laying on today instead of their original dates var timeonly_YESinBetween = moment({hour:datetime_YESInBetween.hour(), minute:datetime_YESInBetween.minute(), second:datetime_YESInBetween.second()}); var timeonly_NOTinBetween = moment({hour:datetime_NOTInBetween.hour(), minute:datetime_NOTInBetween.minute(), second:datetime_NOTInBetween.second()}); //this is where we create datetimes (ignoring to pass the date, sets them at today) var beforeTime = moment('08:00:00', time_format); var afterTime = moment('11:59:59', time_format); //we make the comparison to know which times are between beforeTime and afterTime //note: now all those datetimes are all in the same day and only time will affect the comparison result var firstComparison = timeonly_YESinBetween.isBetween(beforeTime, afterTime); var secondComparison = timeonly_NOTinBetween.isBetween(beforeTime, afterTime) console.log( firstComparison ); //outputs: true console.log( secondComparison ); //outputs: false
 <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.2/moment.min.js"></script>

And if we wanted to better factor the parts:

 console.log( isBetween('2022-04-04T10:00:00Z', '08:00:00', '11:59:59') ); //true console.log( isBetween('2022-04-04T21:43:59Z', '08:00:00', '11:59:59') ); //false function isBetween(datetime, before, after){ const datetime_format = 'YYYY-MM-DDTHH:mm:ssZ'; const time_format = 'HH:mm:ss'; let originalDatetime = moment(datetime, datetime_format); let transformed = moment({hour:originalDatetime.hour(), minute:originalDatetime.minute(), second:originalDatetime.second()}); var beforeTime = moment(before, time_format); var afterTime = moment(after, time_format); return transformed.isBetween(beforeTime, afterTime); }
 <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.2/moment.min.js"></script>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM