Plugin de formato para o objeto Moment Duration.
Este é um plug-in para a biblioteca de datas JavaScript Moment.js para adicionar formatação abrangente às durações do Moment.
A gramática do modelo de formato é padronizada na gramática do modelo de formato Moment Date existente, com algumas modificações porque as durações são fundamentalmente diferentes das datas.
Este plugin não possui nenhuma dependência além do próprio Moment.js e pode ser usado no navegador e no Node.js.
Onde estiver disponível e funcional, este plugin usa Intl.NumberFormat#format
ou Number#toLocaleString
para renderizar a saída numérica formatada. Infelizmente, muitos ambientes não implementam totalmente o conjunto completo de opções em suas respectivas especificações e alguns fornecem uma implementação com erros.
Este plugin executa um teste de recurso para cada formatador e reverterá para uma função de fallback para renderizar a saída numérica formatada se o teste de recurso falhar. Para forçar este plugin a sempre usar a função de formato de número substituto, defina useToLocaleString
como false
. A saída da função de formato de número substituto pode ser localizada usando as opções detalhadas na parte inferior desta página. Você deve, em geral, especificar as opções de formatação de número substituto se a formatação de localidade "en"
padrão for inaceitável em alguns dispositivos ou ambientes.
Este plug-in é testado usando o BrowserStack em uma variedade de dispositivos Android com versões de sistema operacional de 2.2 a 7 e em uma variedade de dispositivos iOS com versões de sistema operacional de 4.3 a 11. Também testado em navegadores Chrome, Firefox, IE 8-11 e Edge. .
Levante um problema se notar problemas de formatação ou anomalias em qualquer ambiente!
Faltam alguns itens para finalizar a Versão 2:
Adicione definições de tipo para oferecer suporte a TypeScript, publicar pacotes NuGet e oferecer suporte a quaisquer outras opções de empacotamento em uso atualmente.
O teste do plugin deve ser modernizado, de preferência para corresponder à configuração de teste do Moment.js.
Tendo implementado a versão 2 do plugin de formato de duração de momento, existem algumas melhorias óbvias para a versão 3.
As ideias abaixo são registradas como problemas e marcadas com o marco 3.0.0. Se você tiver ideias ou comentários sobre o que gostaria de ver, registre um problema neste projeto!
As opções de localização de formatação de número substituto devem ser incluídas nas extensões de objeto Moment Locale que este plug-in já adiciona para localizar rótulos de unidades 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 substituto 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 diretamente, em vez de ocultar algumas das opções e mascará-las atrás de opções precision
e useSignificantDigits
.
Expor a função de formatação de número substituto, bem como a função de teste do recurso do formatador, facilitaria os testes e permitiria que eles fossem usados fora do contexto das durações de formatação.
O plugin depende de moment.js, que não é especificado como uma dependência de pacote na versão publicada atualmente.
Node.js
npm install moment-duration-format
Caramanchão
bower install moment-duration-format
Navegador
<script src="path/to/moment-duration-format.js"></script>
Este plugin sempre tentará se instalar na instância root.moment
, se existir.
Este plugin instalará sua função de configuração em root.momentDurationFormatSetup
para que possa ser chamado posteriormente em qualquer instância momentânea.
Ao usar este plug-in no navegador, se você não incluir moment.js em sua página primeiro, será necessário chamar manualmente window.momentDurationFormatSetup
em sua instância de momento assim que ela for criada.
Para usar este plugin como um módulo, use a função require
.
var moment = require ( "moment" ) ;
var momentDurationFormatSetup = require ( "moment-duration-format" ) ;
O plugin exporta a função init para que o formato de duração possa ser inicializado em outras instâncias de momento.
Para usar este plugin com qualquer outro pacote moment.js, por exemplo moment-timezone
, chame manualmente a função de configuração exportada para instalar o plugin no pacote desejado.
var moment = require ( "moment-timezone" ) ;
var momentDurationFormatSetup = require ( "moment-duration-format" ) ;
momentDurationFormatSetup ( moment ) ;
typeof moment . duration . fn . format === "function" ;
// true
typeof moment . duration . format === "function" ;
// true
moment . duration . fn . format
O método duration.fn.format
pode formatar qualquer duração de momento. Se nenhum modelo ou outros argumentos forem fornecidos, a função de modelo padrão gerará uma sequência de modelo com base no valor da duração.
moment . duration ( 123 , "minutes" ) . format ( ) ;
// "2:03:00"
moment . duration ( 123 , "months" ) . format ( ) ;
// "10 years, 3 months"
O método de formato de duração pode ser chamado com três argumentos opcionais e retorna uma string formatada.
moment . duration ( value , units ) . format ( [ template ] [ , precision ] [ , settings ] )
// formattedString
moment . duration . format
O método duration.format
permite a formatação coordenada de durações de vários momentos de uma só vez. Esta função aceita uma matriz de durações como seu primeiro argumento e, em seguida, os mesmos três argumentos opcionais da função duration.fn.format
. Esta função retorna um array de strings formatadas.
moment . duration . format ( durationsArray , [ template ] [ , precision ] [ , settings ] ) ;
// formattedStringsArray
Todas as opções disponíveis para a função de formato de duração única podem ser usadas com a função de formato de duração múltipla. Um único objeto de configurações é usado para formatar cada uma das durações individuais.
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"]
Durações inválidas são tratadas como tendo um valor 0
para formatação.
var invalidDuration = moment . duration ( NaN , "second" ) ;
invalidDuration . isValid ( ) ;
// false
invalidDuration . format ( ) ;
// "0 seconds"
template
(string|function) é a string usada para criar a saída formatada ou uma função que retorna a string a ser usada como modelo de formato.
moment . duration ( 123 , "minutes" ) . format ( "h:mm" ) ;
// "2:03"
A string do modelo é analisada para caracteres de token de momento, que são substituídos pelo valor da duração para cada tipo de unidade. Os tokens de momento são:
years: Y or y
months: M
weeks: W or w
days: D or d
hours: H or h
minutes: m
seconds: s
ms: S
Caracteres de token de escape dentro da string do modelo usando colchetes.
moment . duration ( 123 , "minutes" ) . format ( "h [hrs], m [min]" ) ;
// "2 hrs, 3 mins"
Para alguns formatos de duração de tempo, é necessário um valor preenchido com zeros. Use vários caracteres token juntos para criar a quantidade correta de preenchimento.
moment . duration ( 3661 , "seconds" ) . format ( "h:mm:ss" ) ;
// "1:01:01"
moment . duration ( 15 , "seconds" ) . format ( "sss [s]" ) ;
// "015 s"
Quando o modelo de formato é cortado, o comprimento do token renderizado de maior magnitude também pode ser cortado. Consulte as seções trim e forceLength abaixo para obter mais detalhes.
moment . duration ( 123 , "seconds" ) . format ( "h:mm:ss" ) ;
// "2:03"
O comprimento do token de 2
para milissegundos é um caso especial, provavelmente usado para renderizar milissegundos como parte de uma saída de timer, como mm:ss:SS
. Nesse caso, o valor de milissegundos é preenchido com três dígitos e depois truncado da esquerda para renderizar uma saída de dois dígitos.
moment . duration ( 9 , "milliseconds" ) . format ( "mm:ss:SS" , {
trim : false
} ) ;
// "00:00:00"
moment . duration ( 10 , "milliseconds" ) . format ( "mm:ss:SS" , {
trim : false
} ) ;
// "00:00:01"
moment . duration ( 999 , "milliseconds" ) . format ( "mm:ss:SS" , {
trim : false
} ) ;
// "00:00:99"
moment . duration ( 1011 , "milliseconds" ) . format ( "mm:ss:SS" , {
trim : false
} ) ;
// "00:01:01"
Os tokens podem aparecer diversas vezes no modelo de formato, mas todas as instâncias devem compartilhar o mesmo comprimento. Caso contrário, todas as instâncias serão renderizadas no comprimento do primeiro token desse tipo.
moment . duration ( 15 , "seconds" ) . format ( "ssss sss ss s" ) ;
// "0015 0015 0015 0015"
moment . duration ( 15 , "seconds" ) . format ( "s ss sss ssss" ) ;
// "15 15 15 15"
A função de modelo padrão tenta formatar uma duração com base em sua magnitude. Quanto maior o valor da duração, maiores serão as unidades da saída formatada.
Para alguns valores de duração, a função de modelo padrão irá trim
o padrão para "both"
se essa opção não estiver definida no objeto de configurações (mais sobre isso abaixo).
A função de modelo padrão usa rótulos de unidade localizados automaticamente (mais sobre isso abaixo também).
moment . duration ( 100 , "milliseconds" ) . format ( ) ;
// "100 milliseconds"
moment . duration ( 100 , "seconds" ) . format ( ) ;
// "1:40"
moment . duration ( 100 , "days" ) . format ( ) ;
// "3 months, 9 days"
moment . duration ( 100 , "weeks" ) . format ( ) ;
// "1 year, 10 months, 30 days"
moment . duration ( 100 , "months" ) . format ( ) ;
// "8 years, 4 months"
Use uma função de modelo personalizada se precisar de controle de tempo de execução sobre a sequência do modelo. As funções de modelo são executadas com uma ligação this
do objeto settings e têm acesso ao objeto de duração subjacente por meio de this.duration
. Qualquer uma das configurações pode ser acessada ou modificada pela função de modelo.
Esta função de modelo personalizado usa um modelo diferente com base no valor da duração:
function customTemplate ( ) {
return this . duration . asSeconds ( ) >= 86400 ? "w [weeks], d [days]" : "hh:mm:ss" ;
}
moment . duration ( 65 , 'seconds' ) . format ( customTemplate , {
trim : false
} ) ;
// "00:01:05"
moment . duration ( 1347840 , 'seconds' ) . format ( customTemplate , {
trim : false
} ) ;
// "2 weeks, 2 days"
Para garantir uma saída formatada de fácil utilização, os caracteres de pontuação são cortados do início e do fim da saída formatada. Especificamente, período inicial e final .
, vírgula ,
, dois pontos :
e espaço
caracteres são removidos.
precision
(número) define o número de frações decimais ou dígitos inteiros a serem exibidos para o valor final.
O valor de precisão padrão é 0
.
moment . duration ( 123 , "minutes" ) . format ( "h [hrs]" ) ;
// "2 hrs"
A precisão positiva define o número de dígitos de frações decimais a serem exibidos.
moment . duration ( 123 , "minutes" ) . format ( "h [hrs]" , 2 ) ;
// "2.05 hrs"
A precisão negativa define o número de dígitos inteiros a serem truncados para zero.
moment . duration ( 223 , "minutes" ) . format ( "m [min]" , - 2 ) ;
// "200 mins"
settings
é um objeto que pode substituir qualquer uma das opções padrão de formato de duração de momento.
Os argumentos template
e precision
podem ser especificados como propriedades de um único argumento do objeto de settings
ou podem ser passados separadamente junto com um objeto de configurações opcional.
moment . duration ( 123 , "minutes" ) . format ( {
template : "h [hrs]" ,
precision : 2
} ) ;
// "2.05 hrs"
O comportamento trim
padrão é "large"
.
Os tokens de maior magnitude são automaticamente cortados quando não têm valor.
moment . duration ( 123 , "minutes" ) . format ( "d[d] h:mm:ss" ) ;
// "2:03:00"
O corte também funciona quando a string de formato é orientada com a magnitude do token aumentando da esquerda para a direita.
moment . duration ( 123 , "minutes" ) . format ( "s [seconds], m [minutes], h [hours], d [days]" ) ;
// "0 seconds, 3 minutes, 2 hours"
Para interromper completamente o corte, defina { trim: false }
.
moment . duration ( 123 , "minutes" ) . format ( "d[d] h:mm:ss" , {
trim : false
} ) ;
// "0d 2:03:00"
Ao formatar várias durações usando moment.duration.format
, o corte de todas as durações é coordenado na união do conjunto de durações.
moment . duration . format ( [
moment . duration ( 1 , "minute" ) ,
moment . duration ( 1 , "hour" ) ,
moment . duration ( 1 , "day" )
] , "y [years], w [weeks], d [days], h [hours], m [minutes]" ) ;
// [
// "0 days, 0 hours, 1 minute",
// "0 days, 1 hour, 0 minutes",
// "1 day, 0 hours, 0 minutes"
// ]
trim
pode ser uma string, uma lista delimitada de strings, uma matriz de strings ou um booleano. Os valores aceitos são os seguintes:
"large"
Corte tokens de valor zero de maior magnitude até encontrar um token com um valor, um token identificado como stopTrim
ou o token final da sequência de formato. Este é o valor trim
padrão.
moment . duration ( 123 , "minutes" ) . format ( "d[d] h:mm:ss" ) ;
// "2:03:00"
moment . duration ( 123 , "minutes" ) . format ( "d[d] h:mm:ss" , {
trim : "large"
} ) ;
// "2:03:00"
moment . duration ( 0 , "minutes" ) . format ( "d[d] h:mm:ss" , {
trim : "large"
} ) ;
// "0"
"small"
Corte os tokens de valor zero de menor magnitude até encontrar um token com um valor, um token identificado como stopTrim
ou o token final da sequência de formato.
moment . duration ( 123 , "minutes" ) . format ( "d[d] h:mm:ss" , {
trim : "small"
} ) ;
// "0d 2:03"
moment . duration ( 0 , "minutes" ) . format ( "d[d] h:mm:ss" , {
trim : "small"
} ) ;
// "0d"
"both"
Execute o corte "large"
e depois o corte "small"
.
moment . duration ( 123 , "minutes" ) . format ( "d[d] h[h] m[m] s[s]" , {
trim : "both"
} ) ;
// "2h 3m"
moment . duration ( 0 , "minutes" ) . format ( "d[d] h[h] m[m] s[s]" , {
trim : "both"
} ) ;
// "0s"
"mid"
Corte quaisquer tokens de valor zero que não sejam o primeiro ou o último token. Geralmente usado em conjunto com "large"
ou "both"
. por exemplo, "large mid"
ou "both mid"
.
moment . duration ( 1441 , "minutes" ) . format ( "w[w] d[d] h[h] m[m] s[s]" , {
trim : "mid"
} ) ;
// "0w 1d 1m 0s"
moment . duration ( 1441 , "minutes" ) . format ( "w[w] d[d] h[h] m[m] s[s]" , {
trim : "large mid"
} ) ;
// "1d 1m 0s"
moment . duration ( 1441 , "minutes" ) . format ( "w[w] d[d] h[h] m[m] s[s]" , {
trim : "small mid"
} ) ;
// "0w 1d 1m"
moment . duration ( 1441 , "minutes" ) . format ( "w[w] d[d] h[h] m[m] s[s]" , {
trim : "both mid"
} ) ;
// "1d 1m"
moment . duration ( 0 , "minutes" ) . format ( "w[w] d[d] h[h] m[m] s[s]" , {
trim : "both mid"
} ) ;
// "0s"
"final"
Corte o token final se ele tiver valor zero. Use esta opção com "large"
ou "both"
para gerar uma string vazia ao formatar uma duração de valor zero. por exemplo, "large final"
ou "both final"
.
moment . duration ( 0 , "minutes" ) . format ( "d[d] h:mm:ss" , {
trim : "large final"
} ) ;
// ""
moment . duration ( 0 , "minutes" ) . format ( "d[d] h:mm:ss" , {
trim : "small final"
} ) ;
// ""
moment . duration ( 0 , "minutes" ) . format ( "d[d] h[h] m[m] s[s]" , {
trim : "both final"
} ) ;
// ""
"all"
Corte todos os tokens de valor zero. Abreviação de "both mid final"
.
moment . duration ( 0 , "minutes" ) . format ( "d[d] h[h] m[m] s[s]" , {
trim : "all"
} ) ;
// ""
"left"
Mapas para "large"
para suportar a API da versão 1 deste plugin.
"right"
Mapas para "large"
para suportar a API da versão 1 deste plugin.
true
Mapas para "large"
.
null
Mapas para "large"
.
false
Desativa o corte.
Defina largest
como um número inteiro positivo para gerar apenas os n
tokens de momento de maior magnitude, começando com o token de maior magnitude que possui um valor.
Usando a opção largest
o padrão é trim
para "all"
.
moment . duration ( 7322 , "seconds" ) . format ( "d [days], h [hours], m [minutes], s [seconds]" , {
largest : 2
} ) ;
// "2 hours, 2 minutes"
moment . duration ( 1216800 , "seconds" ) . format ( "y [years], w [weeks], d [days], h [hours], m [minutes], s [seconds]" , {
largest : 3
} ) ;
// "2 weeks, 2 hours"
Definir trim
para um valor diferente ou usar stopTrim
pode alterar o token inicial, bem como a saída restante.
moment . duration ( 1216800 , "seconds" ) . format ( "y [years], w [weeks], d [days], h [hours], m [minutes], s [seconds]" , {
largest : 3 ,
trim : "both"
} ) ;
// "2 weeks, 0 days, 2 hours"
moment . duration ( 1216800 , "seconds" ) . format ( "y [years], w [weeks], d [days], h [hours], m [minutes], s [seconds]" , {
largest : 3 ,
trim : "both" ,
stopTrim : "m"
} ) ;
// "2 weeks, 0 days, 2 hours"
moment . duration ( 1216800 , "seconds" ) . format ( "y [years], w [weeks], d [days], h [hours], m [minutes], s [seconds]" , {
largest : 4 ,
trim : false