在我的角度式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中的错误吗?有任何可行的解决方法吗?
答案 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