Moment: Suporte para milissegundos decimais

Criado em 22 jun. 2016  ·  3Comentários  ·  Fonte: moment/moment

(ver 2.13.0)
O padrão ISO permite qualquer número de segundos decimais antes do 'Z' em uma string dateTime. A plataforma .net parece usar 7 casas decimais - enquanto a biblioteca moment.js está apenas analisando as 3 primeiras casas decimais.

Eu fiz o monkey patch do formatador (toISOString ()) para extrair os 7 dígitos completos do objeto de criação - mas este é um hack terrível. Corrigir o analisador seria muito melhor - mas está além do meu entendimento atual.

Talvez haja outra solução alternativa?

Comentários muito úteis

Maggie,

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

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

para mim, eu realmente preciso desses dígitos extras. Zeros não são bons o suficiente.

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

analisa manualmente os milissegundos da string de entrada (se for
acessível).

//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(); } }
Não é bonito - e só funcionará em momentos que foram
originalmente analisado fora de uma string de data ISO. Também será inconsistente
com a função milissegundos (). Uma ideia melhor seria interceptar o
processo de análise e puxe quaisquer segundos decimais para uma propriedade separada em
o objeto de momento - então podemos devolvê-lo conforme necessário.

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

biblioteca moment.js neste ponto - não seria mais um invólucro para um
Objeto Javascript Date.

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

documentação? No momento, o truncamento de milissegundos está implícito no
código de exemplo, mas não explicitamente descrito - e não há explicação como
por que ele se comporta dessa maneira.

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

Cumprimentos,
Ben Hathaway
Desenvolvedor de software
DATUM - Monitoramento Geotécnico e Estrutural

Todos 3 comentários

Como Moment.js é um wrapper para o objeto Date em JavaScript, estamos limitados a três casas decimais (milissegundos). Isso ocorre porque isso é tudo o que o objeto de data suporta, portanto, não há realmente nenhuma maneira de armazenar mais. No entanto, você não deve ter que remendar qualquer coisa para obter sete casas decimais para exibir ou analisar. Esteja ciente de que apenas os três primeiros serão realmente usados.

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

Observe que a saída é preenchida com zero, mas há sete dígitos em ambas as direções.

Maggie,

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

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

para mim, eu realmente preciso desses dígitos extras. Zeros não são bons o suficiente.

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

analisa manualmente os milissegundos da string de entrada (se for
acessível).

//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(); } }
Não é bonito - e só funcionará em momentos que foram
originalmente analisado fora de uma string de data ISO. Também será inconsistente
com a função milissegundos (). Uma ideia melhor seria interceptar o
processo de análise e puxe quaisquer segundos decimais para uma propriedade separada em
o objeto de momento - então podemos devolvê-lo conforme necessário.

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

biblioteca moment.js neste ponto - não seria mais um invólucro para um
Objeto Javascript Date.

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

documentação? No momento, o truncamento de milissegundos está implícito no
código de exemplo, mas não explicitamente descrito - e não há explicação como
por que ele se comporta dessa maneira.

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

Cumprimentos,
Ben Hathaway
Desenvolvedor de software
DATUM - Monitoramento Geotécnico e Estrutural

Olá @maggiepint ,

Estou procurando o mesmo. Depois de depurar por meio de moment.js , percebi que ele chama uma função zerofill .

Como o valor resultante é uma string, não vejo por que zero o preenche🤔🤔🤔
Por exemplo, eu tenho este:

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

Ele imprime 07/30/2020 08:53:50.963000 vez de 07/30/2020 08:53:50.963939

Além disso, percebi que a versão anterior de moment.js não fazia esse preenchimento de zero, por exemplo, a versão 2.5.

Terei que escrever um formatador personalizado agora para reter as informações corretas na data, a menos que uma alteração seja feita em moment.js . Alguma chance de fazermos essa mudança?

Esta página foi útil?
0 / 5 - 0 avaliações