Как справиться с большими датами с помощью моментов? - PullRequest
2 голосов
/ 31 мая 2019

Я пытаюсь найти разницу в месяцах между двумя моментными объектами. Я сделал следующее:

const current = moment()
const future = moment().add('324523546345634563456345','months')
const diff = future.diff(current, 'months')

diff получается как 0. Почему это? Есть ли другой способ обработки больших чисел, например 324523546345634563456345?

1 Ответ

3 голосов
/ 31 мая 2019

Краткий ответ: ваш ввод превышает ограничения встроенных в JavaScript целочисленных типов и типов Date.Чтобы выполнить вычисления с такими большими числами, используйте тип BigInt.(Большинство библиотек дат, таких как MomentJS, не поддерживают BigInt, одной из причин является то, что обычные целые числа предоставляют разумный диапазон дат.)


Самое большое целое число, которое может быть представлено встроенным JavaScriptцифры 9,007,199,254,740,991 .Числа с плавающей запятой идут намного выше, но, вероятно, не имеют смысла для этого типа использования (было бы слишком много пробелов с плавающей запятой).

Ваш ввод: 324 523 546 345 644 563 456 345 на много порядков больше, чем JavaScriptвстроенная поддержка целых чисел.Это даже до рассмотрения дополнительных порядков после преобразования месяцев в миллисекунды.

Честно говоря, я удивлен, что результат был 0, а не NaN.

Кроме того, я считаю, что MomentJS внутреннеиспользует встроенный JavaScript тип даты.Максимальная дата составляет около год 275,760 .Ваш вклад потребует поддержки в течение года, в прошлом году.Фактически, ваш вклад превышает возраст вселенной .

Если вам действительно нужно сделать такой расчет, вы можете использовать BigInt с.Возможно, вам придется выполнять вычисления вручную, потому что я не думаю, что какая-либо связанная со временем библиотека будет поддерживать такие большие даты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...