momentjs错误地计算日期差

时间:2018-11-01 14:35:26

标签: momentjs

在我的角度式Web应用程序中,我想比较两个日期,以查看某人进入公司时是否小于18岁。这是我用来执行此操作的代码:

  const dayOfBirth = moment(formControl.value, this.dateFormat, true).startOf('day');
  const entranceDateControl = this.wizardFormGroup.get('entranceDate');
  const entranceDate = moment(entranceDateControl.value, this.dateFormat, true).startOf('day');

  // Check validation rule R3: Age is less than 18 compared to entrance date
  const difference = moment.duration(Math.abs(entranceDate.diff(dayOfBirth)));
  if (difference.years() < 18) {
    const validationMessage = this.getValidationMessage('R3', formControlName);
    return validationMessage ? validationMessage.message : null;
  }

如您所见,我正在使用startOf('day')摆脱任何时间成分,因此我只处理日期。我使用diff()来获取两个日期之间的差额,然后使用duration()来将差额转换为年,月,日等。使用此代码,当该人年满18岁时,验证消息不应显示他/他进入公司当日的三岁。

测试后,我发现奇怪的行为。根据使用的月份和年份,得出不同的结果。例如,这些日期还可以:

dayOfBirth   = 1998-03-01, 1998-04-01, ..., 2000-02-01
entranceDate = 2016-03-01, 2016-04-01, ..., 2018-02-01

但是以下日期返回了验证消息:

dayOfBirth   = 2000-03-01, 2000-04-01, ..., 2002-02-01
entranceDate = 2018-03-01, 2000-04-01, ..., 2020-02-01

在这些日期之后,即使用2002-03-01开始,它将再次起作用。在1998-03-01之前的日期我也得到了错误的结果。

现在,我仔细查看了Duration对象,我发现在不到18年的时间里,它计算得出的时间少于正确的864毫秒,直到得出正确的结论两次约会之间已经有18年了。

Correct duration
----------------
dayOfBirth   = 1998-03-01, 1998-04-01, ..., 2000-02-01
entranceDate = 2016-03-01, 2016-04-01, ..., 2018-02-01

Duration = 568080000000 ms

Wrong duration
--------------
dayOfBirth   = 2000-03-01, 2000-04-01, ..., 2002-02-01
entranceDate = 2018-03-01, 2000-04-01, ..., 2020-02-01

Duration = 567993600000 ms

Duration difference
-------------------
568080000000 - 567993600000 = 86400000 ms = 24 hours = 1 day

有人对此有解释吗?可以将其视为momentjs中的错误吗?有任何可行的解决方法吗?

1 个答案:

答案 0 :(得分:2)

我暂时没有详细介绍源代码,但似乎duration()在和您玩弄技巧。简化代码并按照以下步骤仅依靠diff,您应该会很好(至少它似乎对您提供的示例有效)。而且在眼睛上更容易:)

const moment = require('moment')

const dayOfBirth = moment('2000-03-01').startOf('day');
const entranceDate = moment('2018-03-01').startOf('day');
const difference = entranceDate.diff(dayOfBirth, 'years') 

if (difference < 18) {
  console.log( '<18')
} else {
  console.log( '>=18')
}

将输出>=18