繁体   English   中英

如何使用 moment.js 检查时间是否在给定范围内?

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

我正在使用 moment.js 库。

我想检查我从后端获取的时间是否在上午 8 点到中午(中午 12 点)之间。 我想存储时间在上午 8 点到中午 12 点之间的所有对象。

我以这种格式获取日期 - "2022-04-04T21:43:59Z" 我想使用时区"America/Detroit"

这是我尝试过的方法,但这没有用;

  //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')
  }

在 output 中,我得到is not between ,但实际上有一些数据的日期和时间在上午 8 点到中午 12 点之间。 因为时区有什么问题吗?

您的比较不起作用的原因是因为它不仅使用时间而且还使用日期。

您应该首先从输入日期时间推断时间并使用该数据进行比较,如下所示:

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

那是因为所有这 3 个日期时间都将位于同一太阳日,并且只有时间与比较相关。

另外,在解析输入日期时间和之前和之后使用的时间时,您错误地处理了格式。

这是一个显示概念的工作解决方案:

 //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>

如果我们想更好地分解这些部分:

 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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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