如何使用momentjs处理大日期?

时间:2019-05-31 05:56:42

标签: javascript date time momentjs

我试图找到两个瞬间物体之间的月份差异。我做了如下:

SQL> with
  2  kpol (sifra_rad, dat_izd) as
  3    (select '7654' , date '2009-01-01' from dual union all
  4     select '00547', date '2013-03-01' from dual union all
  5     select '00214', date '2013-03-01' from dual union all
  6     select '00547', date '2013-04-01' from dual union all
  7     select '00654', date '2013-04-04' from dual
  8    ),
  9  sifrad (sifra_r, ime) as
 10    (select '00214', 'Test123' from dual union all
 11     select '00547', 'Aladin'  from dual union all
 12     select '00654', 'Test'    from dual union all
 13     select '0214' , 'AbBbCc'  from dual
 14    )
 15  select p.sifra_rad,
 16         s.ime,
 17         p.dat_izd
 18  from kpol p join sifrad s on p.sifra_rad = s.sifra_r
 19  where extract (year from p.dat_izd) = 2013
 20  order by p.sifra_rad;

SIFRA IME     DAT_IZD
----- ------- ----------
00214 Test123 01.03.2013
00547 Aladin  01.04.2013
00547 Aladin  01.03.2013
00654 Test    04.04.2013

SQL>

const current = moment() const future = moment().add('324523546345634563456345','months') const diff = future.diff(current, 'months') 的值为0。为什么?有没有其他方法可以处理像diff这样的大数字?

1 个答案:

答案 0 :(得分:3)

简短的回答:您的输入超出了JavaScript内置的整数和日期类型的限制。要使用如此大的数字进行计算,请使用类型BigInt。 (像MomentJS这样的大多数日期库都不支持BigInt,原因之一是正整数提供了合理的日期范围。)


JavaScript内置数字可以表示的最大整数是9,007,199,254,740,991。浮点数要高得多,但对于这种类型的用例来说可能没有意义(浮点间隙太多)。

您的输入:324,523,546,345,634,563,456,345比JavaScript内置整数支持的输入大许多数量级。在将月份转换为毫秒之后,甚至还没有考虑其他数量级。

坦率地说,我很惊讶结果为0而不是NaN

此外,我相信MomentJS在内部使用内置的JavaScript Date类型。最长日期约为year 275,760。您的意见将需要一年的支持,直到今年为止。实际上,您的输入大于the age of the universe

如果您确实需要进行这样的计算,则可以使用BigInt s。您可能必须手动进行计算,因为我认为没有任何与时间相关的库都支持这么大的日期。