Moment: Поддержка десятичных миллисекунд

Созданный на 22 июн. 2016  ·  3Комментарии  ·  Источник: moment/moment

(версия 2.13.0)
Стандарт ISO допускает любое количество десятичных секунд перед буквой «Z» в строке dateTime. Платформа .net, похоже, использует 7 знаков после запятой, тогда как библиотека moment.js анализирует только первые 3 знака после запятой.

У меня обезьяна пропатчила средство форматирования (toISOString ()), чтобы вытащить полные 7 цифр из объекта создания - но это ужасный взлом. Исправить парсер было бы намного лучше, но это выходит за рамки моего текущего понимания.

Возможно, есть другой обходной путь?

Самый полезный комментарий

Мэгги,

Ah. I hadn't realised this was a limitation of Javascript.

I had found the option for formatting that you had mentioned - but

мне действительно нужны эти лишние цифры. Нулей недостаточно.

My 'monkey patch' looks at the creationData for the moment and

вручную анализирует миллисекунды из входной строки (если это
доступный).

//Monkey patch the moment library to use 7 decimal places for seconds in it's standard ISO format - to match C# moment.fn._oldToISOString = moment.fn.toISOString; moment.fn.toISOString = function () { try { var originalDateSplit = moment(this).creationData().input.split("."); var milliseconds = originalDateSplit[originalDateSplit.length - 1]; if (milliseconds.indexOf(this.milliseconds()) === 0) { return moment(this).format('YYYY-MM-DD[T]HH:mm:ss.') + milliseconds + "Z"; } else { return moment(this)._oldToISOString(); } } catch (error) { return moment(this)._oldToISOString(); } }
Это некрасиво - и будет работать только в те моменты, когда
изначально извлекается из строки даты ISO. Это также будет непоследовательно
с функцией milliseconds (). Лучше было бы перехватить
процесс синтаксического анализа и вывести все десятичные секунды в отдельное свойство на
объект момента - тогда мы можем вернуть его по мере необходимости.

However - I do appreciate that we are moving beyond the scope of the

На данный момент библиотека moment.js - она ​​больше не будет оберткой для
Объект Javascript Date.

Perhaps we could make this limitation a little clear in the moment.js

документация? Прямо сейчас подразумевается усечение миллисекунды из
пример кода, но не описан явно - и нет объяснения, как
почему он так себя ведет.

Thank you for your help Maggie - it is much appreciated.

С уважением,
Бен Хэтэуэй
Разработчик программного обеспечения
DATUM - Геотехнический и структурный мониторинг

Все 3 Комментарий

Поскольку Moment.js является оболочкой для объекта Date в JavaScript, мы ограничены тремя десятичными знаками (миллисекундами). Это потому, что это все, что поддерживает объект даты, поэтому на самом деле нет возможности хранить больше. Вам не нужно ничего исправлять, чтобы получить семь десятичных знаков для отображения или синтаксического анализа. Просто имейте в виду, что фактически будут использоваться только первые три.

moment('2016-01-01T05:21:22.1234567Z').format('YYYY-MM-DDTHH:mm:ss.SSSSSSS')
"2015-12-31T23:21:22.1230000"

Обратите внимание, что вывод заполнен нулями, но в обоих направлениях семь цифр.

Мэгги,

Ah. I hadn't realised this was a limitation of Javascript.

I had found the option for formatting that you had mentioned - but

мне действительно нужны эти лишние цифры. Нулей недостаточно.

My 'monkey patch' looks at the creationData for the moment and

вручную анализирует миллисекунды из входной строки (если это
доступный).

//Monkey patch the moment library to use 7 decimal places for seconds in it's standard ISO format - to match C# moment.fn._oldToISOString = moment.fn.toISOString; moment.fn.toISOString = function () { try { var originalDateSplit = moment(this).creationData().input.split("."); var milliseconds = originalDateSplit[originalDateSplit.length - 1]; if (milliseconds.indexOf(this.milliseconds()) === 0) { return moment(this).format('YYYY-MM-DD[T]HH:mm:ss.') + milliseconds + "Z"; } else { return moment(this)._oldToISOString(); } } catch (error) { return moment(this)._oldToISOString(); } }
Это некрасиво - и будет работать только в те моменты, когда
изначально извлекается из строки даты ISO. Это также будет непоследовательно
с функцией milliseconds (). Лучше было бы перехватить
процесс синтаксического анализа и вывести все десятичные секунды в отдельное свойство на
объект момента - тогда мы можем вернуть его по мере необходимости.

However - I do appreciate that we are moving beyond the scope of the

На данный момент библиотека moment.js - она ​​больше не будет оберткой для
Объект Javascript Date.

Perhaps we could make this limitation a little clear in the moment.js

документация? Прямо сейчас подразумевается усечение миллисекунды из
пример кода, но не описан явно - и нет объяснения, как
почему он так себя ведет.

Thank you for your help Maggie - it is much appreciated.

С уважением,
Бен Хэтэуэй
Разработчик программного обеспечения
DATUM - Геотехнический и структурный мониторинг

Привет @maggiepint!

Ищу то же самое. После отладки с помощью moment.js я заметил, что он вызывает функцию zerofill .

Поскольку результирующее значение представляет собой строку, я не понимаю, почему она заполняется нулями🤔🤔🤔
Например, у меня это:

const value = 1596099230963;
const formatString = 'MM/DD/YYYY HH:mm:ss.SSSSSS';
const val = moment.utc(value).format(formatString);
console.log(val);

Он печатает 07/30/2020 08:53:50.963000 вместо 07/30/2020 08:53:50.963939

Кроме того, я заметил, что более старая версия moment.js не выполняет эту нулевую заливку, например, версия 2.5.

Теперь мне придется написать настраиваемый форматировщик, чтобы сохранить правильную информацию в дате, если только не будут внесены изменения в moment.js . Есть ли шанс, что мы сможем это изменить?

Была ли эта страница полезной?
0 / 5 - 0 рейтинги