如何使用 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')
  }

在输出中,我得到所有数据的 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>