【问题标题】:How to use Moment.JS to check whether the current time is between 2 times如何使用 Moment.JS 检查当前时间是否在 2 次之间
【发布时间】:2016-07-11 20:34:26
【问题描述】:

假设当前时间是09:34:00hh:mm:ss),我在两个变量中还有另外两个时间:

var beforeTime = '08:34:00',
    afterTime = '10:34:00';

如何使用 Moment.JS 检查当前时间是否在beforeTimeafterTime 之间?

我见过isBetween(),我尝试过像这样使用它:

moment().format('hh:mm:ss').isBetween('08:27:00', '10:27:00')

但这不起作用,因为一旦我将第一个(当前时间)时刻格式化为字符串,它就不再是时刻对象。我也试过使用:

moment('10:34:00', 'hh:mm:ss').isAfter(moment().format('hh:mm:ss')) && moment('08:34:00', 'hh:mm:ss').isBefore(moment().format('hh:mm:ss'))

但我得到false,因为当我再次格式化当前时间时,它不再是片刻。

如何让它工作?

【问题讨论】:

标签: javascript momentjs


【解决方案1】:

该页面上的示例是

moment('2010-10-20').isBetween('2010-10-19', '2010-10-25'); // true

没有像您的代码那样调用format 函数,所以我建议尝试

moment('09:34:00').isBetween('08:34:00', '10:34:00');

【讨论】:

  • 他应该传递一个解析格式字符串作为第二个参数(见我的回答),否则会引发弃用警告。
【解决方案2】:
  • 您可以将时刻实例传递给isBetween()
  • 省略format() 调用,您想要的是在第二次尝试的第一个 moment() 中传递解析格式,如 int。

就是这样:

var format = 'hh:mm:ss'

// var time = moment() gives you current time. no format required.
var time = moment('09:34:00',format),
  beforeTime = moment('08:34:00', format),
  afterTime = moment('10:34:00', format);

if (time.isBetween(beforeTime, afterTime)) {

  console.log('is between')

} else {

  console.log('is not between')

}

// prints 'is between'

【讨论】:

  • 这看起来很棒! +1但我如何将当前时间格式化为'hh:mm:ss'而不使用.format()?那么,与其硬编码当前的time,我可以通过时刻获得它吗?
  • 基本上是一种方式来做类似的事情:moment('hh:mm:ss') 没有真正给时间,因为我想给我时间......
  • 啊,在这种情况下,只需执行moment()。如果不输入时间字符串,则不必指定输入格式。稍后,当您想为用户实际打印出 HTML 中的日期时,您希望给 moment 一个 output 格式,因此您使用.format('hh:mm:ss'),但这是最后一步.对于介于两者之间的所有内容(计算、比较等),都不需要格式。
  • 我认为令人困惑的一点是为什么作者使用 hh:mm:ss 而不是 HH:mm:ss 因为 hh:mm:ss 是 12 小时格式,这对我来说没有意义指定上午和下午。
  • 它不起作用,因为您的 afterTime 在您的 beforeTime 之前:01:34 在 20:34 之前。您当然希望在第二天 01:34,但您没有定义。所以简单地做moment('01:34:00', format).add(1, 'day')
【解决方案3】:

在我的情况下,我必须使用 isBetweenisSame 来覆盖我在 isBetween 条件中使用的 beforeafter 时间。

function getTimeCategory(time) {
  let timeCategory = '';
  const timeFormat = 'HH:mm:ss';

  if (
    time.isBetween(moment('00:00:00', timeFormat), moment('04:59:59', timeFormat)) ||
    time.isSame(moment('00:00:00', timeFormat)) ||
    time.isSame(moment('04:59:59', timeFormat))
  ) {
    timeCategory = 'DAWN';
  } else if (
    time.isBetween(moment('05:00:00', timeFormat), moment('11:59:59', timeFormat)) ||
    time.isSame(moment('05:00:00', timeFormat)) ||
    time.isSame(moment('11:59:59', timeFormat))
  ) {
    timeCategory = 'MORNING';
  } else if (
    time.isBetween(moment('12:00:00', timeFormat), moment('16:59:59', timeFormat)) ||
    time.isSame(moment('12:00:00', timeFormat)) ||
    time.isSame(moment('16:59:59', timeFormat))
  ) {
    timeCategory = 'NOON';
  } else if (
    time.isBetween(moment('17:00:00', timeFormat), moment('23:59:59', timeFormat)) ||
    time.isSame(moment('17:00:00', timeFormat)) ||
    time.isSame(moment('23:59:59', timeFormat))
  ) {
    timeCategory = 'NIGHT';
  }

  return timeCategory;
}

【讨论】:

  • 使用moment().format("a")获取时间类别更方便。但我知道你上面写的只是问题答案的一个例子。
  • 来自文档:“版本 2.13.0 引入了包容性。A [ 表示包含一个值。A ( 表示排除。如果使用 inclusivity 参数,则必须传递两个指标。”所以你可以使用isBetween(first, second, null, '[]'); 消除isSame
【解决方案4】:

我使用了矩函数组合 isSameOrAfter 和 isSameOrBefore 而不是 isBetween。

if(moment(currentTime,'HH:mm:ss').isSameOrAfter(moment(shift_dayFrom,'HH:mm:ss')) && 
moment(currentTime,'HH:mm:ss').isSameOrAfter(moment(shift_dayTo,'HH:mm:ss')))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 2014-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多