Moment: formatação de duração

Criado em 5 set. 2013  ·  118Comentários  ·  Fonte: moment/moment

Já tocamos nisso antes em #463 e #879, mas nunca falamos sobre isso diretamente em sua própria edição.

Precisamos de um método para formatar durações semelhante à forma como formatamos datas. Deve ser tão simples quanto:

moment.duration(x).format("H:mm:ss")

Observe que os tokens de formatação teriam que ter um significado ligeiramente diferente, pois estamos representando uma duração de tempo decorrido, em vez de uma hora do dia. Sugiro o seguinte:

  • hh significaria "horas restantes depois de contabilizar os dias"
  • h seria a forma de um dígito de hh
  • HH significaria "total de horas inteiras"
  • H seria a forma de um dígito de HH
  • HHH significaria "total de horas incluindo decimais" - embora isso possa ser feito atualmente com duration.asHours() , então isso pode não ser necessário.

Uma formatação semelhante se aplicaria a outras unidades. Nesse contexto, a unidade mais alta seria um "dia", que seria um dia padrão composto por 24 horas padrão. Não faria sentido medir anos ou meses com isso devido a problemas de calendário.

Observe que isso surgiu recentemente (novamente) no StackOverflow nesta pergunta . O usuário estava procurando algo como duration.format("H:mm:ss") . Esta é a solução alternativa:

Math.floor(duration.asHours()) + moment.utc(duration.asMilliseconds()).format(":mm:ss")

Isso funciona, mas parece hacky. Isso deve ser embutido.

New Feature Up-For-Grabs

Comentários muito úteis

Não é melhor fazer

moment.utc(total.asMilliseconds()).format("HH:mm:ss");

em vez de

Math.floor(duration.asHours()) + moment.utc(duration.asMilliseconds()).format(":mm:ss")

Todos 118 comentários

+1

moment.duration(x).format("H:mm:ss") era exatamente o que eu esperava, antes de entender que não daria certo. A solução alternativa sugerida por Matt funcionou bem, mas comparando com a elegância de outras coisas em momentjs, com certeza parece hacky.

Não é melhor fazer

moment.utc(total.asMilliseconds()).format("HH:mm:ss");

em vez de

Math.floor(duration.asHours()) + moment.utc(duration.asMilliseconds()).format(":mm:ss")

Code Bounty

@RobinvdVleuten - O problema de usar HH no formatador atual é que ele representa a hora _portion_ de uma data e hora completas. Ao lidar com um tempo _decorrido_, pode haver 24 horas ou mais. Tente passar 24 horas e você verá que ele é redefinido para zero.

Eu notei isso mesmo. Agora estou usando os milissegundos calculados para formatá-lo, mas ainda é uma solução alternativa.

Você está pensando que haverá apenas um "nível" de resto possível - por exemplo, não há como dizer "horas depois de contabilizar meses"? Eu acho que é uma limitação perfeitamente razoável, mas apenas para cuspir um segundo, eu poderia imaginar fornecer um argumento "âncora", assim:

moment.duration(x).format("hh:mm:ss", "M");

O que nos diz que as horas devem ser módulo do mês. A âncora é opcional e padrão para a maior unidade mais um tamanho acima (neste caso, dias). Da mesma forma, ele pode usar a própria string para determinar que os minutos são módulo as horas e os segundos módulo minutos. Considerando que se você fez isso:

moment.duration(x).format("hh:ss");

...os segundos seriam modulo as horas.

Isso provavelmente não é uma ótima ideia - não está resolvido (para onde vão as semanas nessa hierarquia?) e provavelmente é desnecessário (é improvável que as pessoas queiram buracos como esse). Mas divertido de se pensar.

Em uma nota mais séria, como você vai lidar com mês vs minutos com essa notação de letras minúsculas/maiúsculas?

Eu estava imaginando que os dias seriam o tamanho máximo da unidade, então os meses não entrariam em cena. Basicamente, este é o inverso de como analisamos as durações provenientes de intervalos de tempo do asp.net.

Faz sentido.

Eu tenho lido um documento SCORM 2004 RTE (p77) e descobri que para a representação do intervalo de tempo é a seguinte, acho que isso veio de um padrão,

em teoria eu posso passar um valor como: P34H
e os analisadores devem interpretar isso como 1 dia e 10 horas

espero que seja possível formatar a saída com isso em mente
como 'PHM'
e o formatador interpreta isso como total de horas restantes minutos?
eu gostaria de poder formatar a saída como HH:MM

espero que esta informação seja útil

intervalo de tempo (segundo, 10,2): O intervalo de tempo (segundo, 10, 2) denota que o valor para
o intervalo de tempo do elemento do modelo de dados representa o tempo decorrido com uma precisão de 0,01
segundos[1]. A ligação de notação de ponto SCORM define um formato específico para um
string de caracteres para representar um intervalo de tempo.
O formato da cadeia de caracteres deve ser o seguinte:
P[yY][mM][dD][T[hH][nM][s[.s]S]] onde:
• y: O número de anos (inteiro, >= 0, não restrito)
• m: O número de meses (inteiro, >=0, não restrito)
• d: O número de dias (inteiro, >=0, não restrito)
• h: O número de horas (inteiro, >=0, não restrito)
• n: O número de minutos (inteiro, >=0, não restrito)
• s: O número de segundos ou fração de segundos (real ou inteiro, >=0, não
restrito). Se frações de segundo são usadas, o SCORM restringe ainda mais a string para
um máximo de 2 dígitos (por exemplo, 34,45 – válido, 34,45454545 – não válido).
• Os designadores de literais de caracteres P, Y, M, D, T, H, Mand S aparecerão se o
valor diferente de zero correspondente está presente.
• O preenchimento zero dos valores deve ser suportado. O preenchimento zero não altera o
valor inteiro do número que está sendo representado por um conjunto de caracteres. Por
exemplo, PT05H é equivalente a PT5H e PT000005H.
Exemplo:
• P1Y3M2DT3H indica um período de tempo de 1 ano, 3 meses, 2 dias e 3 horas
• PT3H5M indica um período de 3 horas e 5 minutos

Os implementadores devem estar cientes de que o formato e a vinculação são para a comunicação de
os dados entre um SCO e um LMS. Como o formato representa um período de tempo,
então uma duração como PT5M é equivalente a PT300S.
Se o elemento do modelo de dados, que é do tipo timeinterval(second,10,2) contiver um valor, então
• O designador P deve estar presente;
• Se o valor de anos, meses, dias, horas, minutos ou segundos for zero, o valor
e a designação literal de caractere correspondente pode ser omitida, mas pelo menos um
o designador literal de caractere e o valor devem estar presentes além do designador
P;
• O designador T deve ser omitido se todos os componentes de tempo (horas, minutos
e segundos) não são usados. Um valor zero pode ser usado com qualquer tempo
componentes (por exemplo, PT0S).

A formatação de duração seria uma excelente adição. Não há necessidade de dois tokens de "hora" distintos. Considere uma duração de 32 horas. Você nunca iria querer extrair apenas 8 horas sem extrair também 1 dia.

Acho que @icambron tem uma boa sugestão. Analise a string de formato em tokens e expresse a duração em termos da maior unidade. Analise os tokens um de cada vez em ordem (por exemplo, "DD:hh:ss" significa número de dias completos, número de horas completas após contabilizar dias, número de segundos completos após contabilizar dias + horas).

Eu postei um plugin moment.duration.format:
https://github.com/jsmreese/moment-duration-format

Acho que aborda a maioria das ideias / casos de uso neste tópico.

@jsmreese Você considerou preencher uma solicitação de pull que contém seu plug-in como parte principal do momentjs?

@hotzenklotz Sim, considerei preencher uma solicitação de pull.

Eu não fiz isso por causa de todas as razões que @icambron expôs em #1538.

Meu plug-in:

  • depende do Lo-Dash
  • não se parece com o código Moment.js
  • usa uma configuração de teste completamente diferente

Eu adoraria que meu plugin se tornasse parte do núcleo do Moment.js... mas não vou perder seu tempo com um pull request antes que esses problemas sejam resolvidos.

Também gostaríamos de ter certeza de que o código pode ser internacionalizado. Felizmente, a maioria das strings que precisaríamos estão no Unicode CLDR, portanto, muito pouco trabalho de tradução deve ser necessário.

O CLDR também tem recomendações específicas de localidade sobre como formatar certos tipos de intervalos, que podem ser mais úteis do que formatos de duração arbitrários. Não tenho certeza de como isso se encaixa aqui, mas pode ser bom poder exibir automaticamente intervalos específicos de localidade entre dois horários específicos.

O CLDR também tem informações sobre como exibir intervalos de tempo específicos (em vez de durações) que podem ser úteis em algum momento...

Dados do calendário em inglês (EUA)

Acabei de publicar uma nova versão do Moment Duration Format que remove a dependência anterior de Lo-Dash ou Underscore.

https://github.com/jsmreese/moment-duration-format

@jsmreese Atende perfeitamente às nossas necessidades. Obrigado!

+1

+1

+1

+1

+1

+1

+1

+1

Provavelmente pareço um disco quebrado nesta questão, mas gostaria de garantir que qualquer solução siga as convenções existentes sempre que possível e possa ser facilmente internacionalizada (o que inclui adicionar símbolos semelhantes a LLLL para formatos de duração comumente usados .

Um tanto irritantemente, o CLDR não fornece muitas diretrizes específicas para durações de formatação, embora existam extensas diretrizes relativas de duração e intervalo que podem ser úteis em outro lugar. No entanto, eles fornecem algumas diretrizes e traduções mínimas para unidades de duração , o que permitiria concatenar as unidades relevantes ao implementar algo como humanize() .

A sintaxe hh / h descrita acima parece um desvio significativo dos tokens de formatação usados ​​por ISO8601, CLDR e Apache , e eu preferiria evitá-la se possível.

Uma proposta melhor seria inferir o uso da unidade mais significativa no padrão de formatação como o módulo, então h:mm:ss exibiria um horário "normal", mas contaria as horas após 24 (por exemplo, 26:30:00). Não está claro como alguém poderia calcular um padrão como "HH:MM:ss" , ou qual seria o caso de uso para isso. Permitir que os desenvolvedores substituam esse comportamento também parece que pode facilmente se tornar uma fonte de bugs.

Mantendo o espírito de "i18n em todos os lugares", o CLDR define formatos de duração para:

  • Horas + minutos ( h:mm em EN-US)
  • Horas + minutos + segundo ( h:mm:ss em EN-US)
  • Minutos + segundos ( m:ss em EN-US)
    e pode fazer sentido fornecer constantes específicas de localidade (semelhante aos formatos de data LLL ) para essas durações de tempo.

Infelizmente, durações de formatação com unidades maiores que horas são realmente difíceis de expressar por meio de uma única string de formatação (graças às regras de pluralização que você precisa considerar), e não consegui encontrar _any_ biblioteca em nenhum idioma que permita formatação fácil e compatível com i18n de durações superiores a 24 horas. O melhor que você pode fazer seria estender duration.humanize() para pegar alguns parâmetros extras, implementando efetivamente a proposta original em #463.

Em suma, pode não ser uma boa ideia implementar duration.format() , pois vejo qualquer solução em potencial com armadilhas consideráveis. Sua melhor aposta seria melhorar duration.humanize() ou implementar um duration.format() reduzido que compreende apenas horas, minutos e segundos.

+1

Caso você precise de uma função rápida para adicionar preenchimento:

function padWithZero(input, length) {
    // Cast input to string
    input = "" + input;

    let paddingSize = Math.max(0, length - input.length);
    return new Array(paddingSize > 0 ? paddingSize + 1 : 0).join("0") + input;
}

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

:+1:

:+1: momento de surpresa não faz isso, geralmente nunca me falhou!

+1 Eu usei o formato de duração de momento, mencionado acima, mas não é internacionalizado. Estou tentando produzir dias e provavelmente precisarei de meses também, o que realmente precisa de rótulos.

Há algum progresso com esta questão?

+1

+1

+1

+1

:+1:

+1
por que ainda não está no núcleo?

+1 +1 +1 +1 +1

+1

+2

@jsmreese seu plugin suporta i18n?

@rumeshwick : talvez? Isso realmente depende de como você está fazendo o i18n e o que você espera do meu plugin.

+1

Descobri que é possível dessa maneira hacky:

  var dur = moment.duration('PT90M');
  moment(dur._data).format('[it\'s] D [days and] h [hour]');

Isso rende:

"é 1 dias e 1 hora"

Você não pode, no entanto, imprimir algo como "é 1 dia e 90 minutos".
Para meus propósitos, isso é suficiente.
Não inclui i18n, mas no meu caso não quero que isso seja resolvido pelo moment.js.

Oi, tenho um ajudante Ember.JS aqui para isso:

https://github.com/ember-building-blocks/ember-hbs-date-helpers

+1

+1 para o jeito hacky de @vanthome :+1:

@jsmreese - você estaria interessado em mesclar seu plugin no núcleo do momento? Seria muito útil e muito apreciado.

Ele precisaria ser reformatado para se adequar à nova implementação do ES6 e ter algumas funções redundantes substituídas por equivalentes de momento, mas no geral acho que seria bastante fácil.

@mj1856 definitivamente interessado. Vou enviar um ping para você por e-mail com algumas perguntas.

Yay! Muito bem, @jsmreese e @mj1856!!! :clap: :clap: :clap:

Vim aqui apenas para propor mesclar o plugin do @jsmreese ao moment js.

+1

+1

Como parece que o @jsmreese está com pouco tempo, estou marcando isso como Up For Grabs. Essencialmente, o PR proposto deve implementar todas as funcionalidades do plugin moment-duration-format do @jsmreese , mas deve estar em conformidade com o estilo ES2015 que está sendo usado no moment.js e deve reutilizar o máximo do momento existente. js para minimizar o tamanho do código.

+1

Um recurso que falta no plug-in de formato de duração de momento do @jsmreese é a capacidade de construir de volta um objeto de duração a partir da string formatada.

ei @ mj1856 , estou interessado em abordar a integração do plug-in de formato no momento. como a contribuição funciona aqui com o rótulo Up-For-Grabs , devo apenas trabalhar nisso e enviar o PR para o ramo develop , ou alguém o reivindicou?

@joshrowley não é reivindicado, mas você seria um herói se conseguisse. Vá em frente e pegue, e quando estiver pronto, envie um puxão. Este será um pouco mais complicado do que os outros disponíveis, portanto, se você quiser, sinta-se à vontade para enviar uma solicitação de pull para revisão antes de terminar - ficaremos atentos a isso. Seremos exigentes em não explodir o tamanho da biblioteca com esta - ela já é maior do que gostaríamos. Por favor, esteja atento a isso.

Talvez eu lide com isso também (ou em vez disso), mas primeiro preciso se encaixar em toda a estrutura de desenvolvimento do momento.

Trabalho em andamento PR: #3308

Oi pessoal, eu abri um PR na #3615 e adoraria alguns olhos nele!

talvez isso esteja relacionado - problemas encontrados:
moment.duration(3500000).format("hh:mm", { forceLength: true })
que exibe o resultado: 58, em vez de 00:58

http://stackoverflow.com/questions/41443233/using-moment-js-to-display-duration-in-format-00xx-when-duration-is-less-than-a

ms = moment(moment().format(),"YYYY-MM-DD HH:mm:ss").diff(moment(time,"YYYY-MM-DD HH:mm:ss"));
var duration = moment.duration(ms);
moment(duration._data).format("HH:mm");

Mais um hack para formatar durações....

var timeInSeconds = 5000;
var formattedDur = moment("1900-01-01 00:00:00").add(timeInSeconds, 'seconds').format("HH:mm:ss");

+1

Observe que os hacks postados por @fabiogalera e @befreestudios parecem funcionar bem para durações < 24 horas, mas nenhum deles funciona para durações superiores a 24 horas.

EDIT: Isso parece ser devido a estar em uma versão mais antiga do momento. Acabei de tentar novamente com a versão mais recente e funciona como esperado. Desculpe pela confusão.
-
Eu também encontrei alguns erros de arredondamento estranhos/casos de borda com o hack original postado por @ mj1856 no topo deste tópico. Por exemplo, tente 2,3 ou 4,1 horas. Esses são valores decimais que devem ser divididos uniformemente em um número de minutos.

Por exemplo, 2,3 deve ser exatamente 2:18:00, mas você obterá 2:17:59. E 4.1 deve ser exatamente 4:06:00, mas você terá 4:05:59. Isso parece ser devido aos métodos duration.asXXX() terem alguns problemas de precisão/arredondamento. Alguém já viu isso e tem alguma sugestão?

Aqui está minha função para duration.format com base em Date.format (https://gist.github.com/ptquang86/2893903)

moment.duration.fn.format = moment.duration.fn.format || function (mask): string {
            // Some common format strings
            let formatMasks = {
                "default":      "DD MM YYYY HH:mm:ss",
                shortDate:      "M/D/YY",
                mediumDate:     "MM DD, YYYY",
                longDate:       "MM DD, YYYY",
                fullDate:       "DD, MM, YYYY",
                shortTime:      "H:mm TT",
                mediumTime:     "H:mm:ss TT",
                longTime:       "H:mm:ss TT Z",
                isoDate:        "YYYY-MM-DD",
                isoTime:        "hh:mm:ss",
                isoDateTime:    "YYYY-MM-DD'T'hh:mm:ss",
            };

            let format = function () {
                let token = /D{1,2}|M{1,2}|YY(?:YY)?|([HhmsTt])\1?|[LloSZ]|"[^"]*"|'[^']*'/g;

                function pad(val, len?) {
                    val = String(val);
                    len = len || 2;
                    while (val.length < len) val = "0" + val;
                    return val;
                }

                // Regexes and supporting functions are cached through closure
                return function (date, mask) {
                    mask = String(formatMasks[mask] || mask || formatMasks["default"]);

                    let D = date.days(),
                        m = date.months(),
                        y = date.years(),
                        H = date.hours(),
                        M = date.minutes(),
                        s = date.seconds(),
                        L = date.milliseconds(),
                        flags = {
                            D:    D,
                            DD:   pad(D),
                            M:    m + 1,
                            MM:   pad(m + 1),
                            YY:   String(y).slice(2),
                            YYYY: y,
                            H:    H % 12 || 12,
                            HH:   pad(H % 12 || 12),
                            h:    H,
                            hh:   pad(H),
                            m:    M,
                            mm:   pad(M),
                            s:    s,
                            ss:   pad(s),
                            l:    pad(L, 3),
                            L:    pad(L > 99 ? Math.round(L / 10) : L),
                            t:    H < 12 ? "a"  : "p",
                            tt:   H < 12 ? "am" : "pm",
                            T:    H < 12 ? "A"  : "P",
                            TT:   H < 12 ? "AM" : "PM",
                        };

                    return mask.replace(token, function ($0) {
                        return $0 in flags ? flags[$0] : $0.slice(1, $0.length - 1);
                    });
                };
            }();

            return format(this, mask);
        };

use: moment.duration(10000).format("hh:mm:ss:l")

+1

Alguma novidade aqui, momento vai conseguir essa funcionalidade? Qual é o consenso?

+1

Batendo novamente, é como o 4º projeto em que eu queria usar essa função. Espero vê-lo implementado no moment.js muito em breve.

+1

Estou de olho nisso há muito tempo, esperando que esse recurso seja implementado. Existe algum trabalho em andamento sobre isso?

Tanto quanto eu sei que está funcionando agora, eu tenho no meu aplicativo, verifique os documentos:
https://momentjs.com/docs/#/durations/

@luchillo17 Você está falando sobre durações, em geral, funcionando?

Bem, eu apenas tentei 5 minutos de volta e estava funcionando.

Bem, só queria ser claro sobre o que estamos falando aqui. Durações _do_ trabalho. Este problema é sobre a formatação de durações.

Meu mal, o fio é tão grande que me perdi no caminho para baixo.

No entanto, agora que olho mais de perto, há um plug-in para formatação de duração de momento listado nos documentos:
https://momentjs.com/docs/#/plugins/duration -format/

É isso que vocês esperam? parece que ainda tem definições de tipo TypeScript.

E eu testei, funciona muito bem.

O plugin funciona muito bem. Adoraria vê-lo integrado ao Moment.js. Não consigo ver como as durações são úteis sem ele.

É um plugin porque nem todas as pessoas usam duração, não vejo muita base de usuários precisando de durações para justificar o aumento da base de código.

Estou até surpreso que todo o módulo de duração não esteja em um plugin.

Ou aquilo. Atualmente, o módulo de duração é inútil para mim. Todas as funções nele são apenas matemática simples que pode ser feita muito bem sem uma biblioteca.
Se o plug-in foi mesclado, posso ver que ele está tendo um bom uso.

Talvez, mas não pensar que a matemática é para que servem as bibliotecas, soluções testadas em batalha para que você e eu não tenhamos que perder tempo com essas tarefas, como por exemplo, eu não sabia que havia tantos padrões de duração, como ISO 8601, o módulo de durações cuida disso para mim, então não preciso saber como esse padrão é definido.

Eu acho.
De qualquer forma, proponho que façamos referência ao plugin na documentação.
Dessa forma, as pessoas sabem que a funcionalidade está lá e não precisam ir ao Google e pesquisar por essa funcionalidade.

Na verdade, demorei um pouco para descobrir a seção de plugins para isso.

4 anos e ainda sem reação dos donos... Isso é triste :(

Oi pessoal,

Isso é algo que ainda estamos trabalhando. Momento é uma comunidade de voluntários! Precisamos garantir que um recurso como esse tenha essas propriedades:
1) funciona em todos os ambientes
2) não adiciona muito volume ao código
3) não reinventa a roda (ou seja, já existe um plugin para fazer isso!)
4) não quebra os recursos existentes

É possível que isso seja mesclado em algum momento.
https://github.com/moment/moment/pull/3615

Se você acha que os documentos podem apontar melhor para o plug-in de formatação de duração (ou outros plug-ins!), envie um PR aqui: https://github.com/moment/momentjs.com/

@marwahaha

não adiciona muito volume ao código
não reinventa a roda (ou seja, já existe um plugin para fazer isso!)

Bem, já que já existe um plugin de formato de duração e duração dentro da biblioteca de momentos, talvez a melhor solução seja tirar a duração de moment.js em um plugin separado e então implementar todas as coisas "pesadas" dentro desse plugin?
Ao fazer isso, 2 objetivos serão alcançados:
1) diminuir o tamanho do moment.js
2) fornecer duração diretamente com os recursos mais úteis em vez de versão muito limitada.

Um grande desafio é que a formatação de duração será muito difícil de implementar em toda a gama de localidades que o moment.js suporta.

Eu odiaria ver essas localidades perderem o suporte de duração limitada que elas têm atualmente, ou que o Moment adicione um recurso que funcione corretamente apenas em algumas localidades. Manter a formatação de duração em um plug-in parece um bom meio-termo que garante que o "núcleo" do moment.js seja estável e funcione para todos, enquanto oferece aos usuários de localidade única a opção de usar plug-ins que executam funções específicas para sua localidade .

O plugin de formatação de duração já existe e é referenciado na documentação. Isso é mais do que suficiente.

@OogieBoogieInJSON Bem, os documentos não são tão úteis, basicamente tive que verificar esse problema antes mesmo de chegar aos plugins nos documentos, há pouca exposição a esses recursos, a menos que você realmente tente ler os documentos inteiros, o que ninguém faz.

@luchillo17 Eu leio todos os documentos antes de trabalhar com qualquer coisa. Provavelmente, isso é só eu.

Haha, sim, é ótimo que você faça, todo mundo deveria, mas a maioria de nós como desenvolvedores tem horários para cumprir, então entender cada porca e parafuso de todas as libs que usamos não é prático.

@luchillo17 Não é culpa da documentação que você faz Programação Orientada ao Gerenciamento. Felicidades!

Para aqueles que seguem a saga de formatação de durações de momentos, publiquei a versão 2.0.0 do meu plugin de formato de duração de momento.

A nova versão resolve/incorpora quase todos os problemas e comentários dos últimos quatro anos que a versão 1 está disponível -- incluindo suporte à localização e pluralização, bem como algumas opções úteis de formatação.

Confira aqui: https://github.com/jsmreese/moment-duration-format/releases

O verdadeiro MVP -> @jsmreese

Ah. Obrigado pelas palavras gentis, @OogieBoogieInJSON.

Não posso deixar de notar que meu plugin está no topo - e não existiria sem - os enormes esforços dos criadores e mantenedores do momento, para não mencionar os muitos, muitos contribuidores. Meu tempo agora para revisitar algo que criei há quatro anos (uau, realmente faz tanto tempo!) francamente empalidece em comparação com o pastoreio contínuo desse projeto!

Aaaaaa e a versão 2.1.0 é publicada.
https://github.com/jsmreese/moment-duration-format/releases

A versão atualizada corrige alguns problemas da versão 2.0 e apresenta moment.duration.format , uma nova função para formatação coordenada de várias durações. Não deve ser confundido com o moment.duration.fn.format já existente.

A nova função recebe uma matriz de durações e retorna uma matriz de strings formatadas e é útil sempre que você tem um grupo de durações que devem ser formatadas juntas de maneira consistente.

moment.duration.format([
    moment.duration(1, "second"),
    moment.duration(1, "minute"),
    moment.duration(1, "hour")
], "d [days] hh:mm:ss");
// ["0:00:01", "0:01:00", "1:00:00"]

moment.duration.format([
    moment.duration(1, "minute"),
    moment.duration(1, "day")
], "w [weeks], d [days], h [hours], m [minutes], s [seconds]", { trim: "all" });
// ["0 days, 1 minute", "1 day, 0 minutes"]

@jsmreese 2.0 levou a alguns erros mais cedo, então eu tive que bloqueá-lo para 1.3.0 por segurança, no entanto, obrigado por manter o recurso/projeto ativo.

@prusswan , por favor, experimente a versão 2.1.0. Eu gostaria de saber se você ainda vê esses erros!

Publiquei a versão 2.2.0 do formato de duração do momento, que agora inclui uma função de formato de número de fallback porque toLocaleString não está totalmente implementado em muitos ambientes.

https://github.com/jsmreese/moment-duration-format/releases

Testei a nova versão usando o BrowserStack em vários dispositivos Android com versões de SO de 2.2 a 7 e em vários dispositivos iOS com versões de SO de 4.3 a 11. Também testei no Chrome, Firefox, IE 8-11, e navegadores Edge.

@prusswan e outros que tiveram que bloquear a versão para 1.3.0 , você provavelmente descobrirá que a versão 2.2.0 é finalmente a substituição imediata que a versão 2.0.0 deveria ser.

Obrigado a todos que registraram problemas na versão 2 deste plugin!

Tendo implementado a versão 2 do plugin moment-duration-format, existem algumas melhorias óbvias para uma versão 3.

Eu listei minhas ideias abaixo e as adicionei como problemas no repositório . Se você tiver ideias ou comentários sobre o que gostaria de ver, por favor me avise!

Espero que a próxima versão seja publicada em algo como 4 meses... não os 4 anos de espera pela versão 2.

  • As opções de localização de formatação de número de fallback devem ser incluídas nas extensões de objeto Moment Locale que já fiz para localizar rótulos de unidade de duração. Isso colocaria toda a configuração de localização em um só lugar.

  • moment-duration-format e sua função de formatação de número de fallback não seguem a mesma API que Number#toLocaleString para dígitos significativos e dígitos de facção. A função de fallback deve ser atualizada para usar a API toLocaleString , e o plug-in deve expor as opções da API toLocaleString diretamente, em vez de ocultar algumas das opções e mascará-las atrás precision e useSignificantDigits opções.

  • Expor a função de formatação de número de fallback, bem como a função de teste de recurso toLocaleString facilitaria o teste e permitiria que eles fossem usados ​​fora do contexto de durações de formatação.

  • Adicione definições de tipo para dar suporte ao TypeScript, publicar o pacote NuGet e dar suporte a quaisquer outras opções de empacotamento que estejam em uso atualmente. (Isso não precisa esperar até a versão 3.)

  • O teste do plug-in deve ser modernizado, idealmente para corresponder à configuração de teste do Moment.js. (Isso também não precisa esperar até a versão 3.)

@jsmreese Trabalho tremendo, mas não se sinta pressionado a aumentar a versão principal duas vezes em um curto período de tempo. Se ainda estiver em uso após 4 anos sem uma atualização, provavelmente é bom o suficiente. Eu sinto que este problema atual pode ser encerrado, pois já existe uma resolução (use os plugins). Uma nova edição pode ser iniciada para decidir se essa funcionalidade deve se tornar parte do próprio momento.

@jsmreese Incrível. Muito obrigado e na hora! Grande negócio para mim e obrigado por tudo o que você faz.

Veja https://momentjs.com/docs/#/ -project-status/

Obrigado por toda a discussão aqui.

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