首页 > 解决方案 > Moment Js 我怎么知道我在目标时间的一个小时内?

问题描述

我正在使用 Moment.js 来尝试确定用户是否在他们预定出发时间的一小时内。如果是,则启用 UI 中的按钮,允许他们开始离开。因此,例如,如果他们打算在下午 3:00 离开,那么他们不应该被允许在下午 1:59 之前按下按钮,但他们应该在下午 2:00 时按下按钮。

目前我正在为我的功能使用以下内容:

const calculateTime = (depTime: string) => {
  const currentTime = moment();
  const hourBeforeDepartue = moment(depTime).subtract(1, 'hour');
  const isWithinHour = currentTime.isBetween(hourBeforeDepartue, depTime);
  return isWithinHour;
};

这里的问题是,当我用 jest 测试它时,我的函数返回 false:

import { calculateTime } from './calculateTime';
import moment from 'moment';

    describe('Function that determines if the time is within departure range', () => {
          it('Is in the hour of departure', () => {
            const oneHourFromNow = moment()
              .add(1, 'hour')
              .format('H:H');
            console.log(oneHourFromNow);
            const response = calculateTime(oneHourFromNow);
            expect(response).toBe(true);
          });
        });

我不确定为什么它会返回 false,而且我不知道有更好的方法来做到这一点。任何帮助,将不胜感激!

标签: javascriptreact-nativemomentjs

解决方案


我最终获得了一个名为 twix 的 moment.js 插件。该插件检查当前时间是否在目标出发时间和之前一小时的时间之间。

import moment from 'moment';
require('twix');

export class Time {
  time: string;
  constructor(time: string) {
    this.time = time;
  }
}

export type DepartureTime = string;

export class CheckTime extends Time {
  public constructor(departureTime: DepartureTime) {
    super(departureTime);
    this.isWithinHour = this.isWithinHour.bind(this);
  }
  private validateTime(departureTime: DepartureTime): boolean {
    return moment(departureTime).isValid();
  }

  public isWithinHour(time: DepartureTime): boolean | null {
    if (!this.validateTime(time)) {
      return null;
    }
    const departureTime = moment(time).format();
    const oneHourPrior = moment(time)
      .subtract(1, 'h')
      .format();
    const timing = moment(oneHourPrior).twix(departureTime);
    return timing.isCurrent();
  }
}

推荐阅读