Complemento de formato para el objeto Duración del momento.
Este es un complemento de la biblioteca de fechas JavaScript Moment.js para agregar un formato completo a las duraciones de los momentos.
La gramática de la plantilla de formato sigue el modelo de la gramática de la plantilla de formato Moment Date existente, con algunas modificaciones porque las duraciones son fundamentalmente diferentes de las fechas.
Este complemento no tiene ninguna dependencia más allá de Moment.js y puede usarse en el navegador y en Node.js.
Cuando esté disponible y sea funcional, este complemento utiliza Intl.NumberFormat#format
o Number#toLocaleString
para representar la salida numérica formateada. Desafortunadamente, muchos entornos no implementan completamente el conjunto completo de opciones en sus respectivas especificaciones y algunos presentan una implementación con errores.
Este complemento ejecuta una prueba de funciones para cada formateador y volverá a una función alternativa para representar la salida numérica formateada si la prueba de funciones falla. Para forzar que este complemento use siempre la función de formato de número alternativo, configure useToLocaleString
en false
. La salida de la función de formato de número alternativo se puede localizar utilizando las opciones que se detallan al final de esta página. En general, debe especificar las opciones de formato del número de reserva si el formato local predeterminado "en"
fuera inaceptable en algunos dispositivos o entornos.
Este complemento se prueba con BrowserStack en una variedad de dispositivos Android con versiones de sistema operativo de 2.2 a 7, y en una variedad de dispositivos iOS con versiones de sistema operativo de 4.3 a 11. También se prueba en los navegadores Chrome, Firefox, IE 8-11 y Edge. .
¡Plantee un problema si nota problemas de formato o anomalías en cualquier entorno!
Quedan algunos elementos para finalizar la Versión 2:
Agregue definiciones de tipos para admitir TypeScript, publicar paquetes NuGet y admitir cualquier otra opción de empaquetado que se utilice en estos días.
Las pruebas del complemento deben modernizarse, idealmente para que coincidan con la configuración de prueba de Moment.js.
Habiendo implementado la versión 2 del complemento de formato de duración del momento, hay algunas mejoras obvias para la versión 3.
Las ideas siguientes se registran como problemas y se etiquetan con el hito 3.0.0. Si tiene ideas o comentarios sobre lo que le gustaría ver, registre un problema en este proyecto.
Las opciones de localización de formato de número alternativo deben incluirse con las extensiones de objeto Moment Locale que este complemento ya agrega para localizar etiquetas de unidades de duración. Esto colocaría toda la configuración de localización en un solo lugar.
moment-duration-format y su función de formato de número alternativo no siguen la misma API que Number#toLocaleString
para dígitos significativos y dígitos de facción. La función alternativa debe actualizarse para usar la API toLocaleString
, y el complemento debe exponer las opciones de la API directamente en lugar de ocultar algunas de las opciones y enmascararlas detrás de las opciones precision
y useSignificantDigits
.
Exponer la función de formato de número de reserva, así como la función de prueba de la característica del formateador, facilitaría las pruebas y permitiría su uso fuera del contexto de las duraciones de formato.
El complemento depende de moment.js, que no está especificado como dependencia del paquete en la versión publicada actualmente.
Nodo.js
npm install moment-duration-format
Cenador
bower install moment-duration-format
Navegador
<script src="path/to/moment-duration-format.js"></script>
Este complemento siempre intentará instalarse en la instancia root.moment
, si existe.
Este complemento instalará su función de configuración en root.momentDurationFormatSetup
para que pueda ser invocado más tarde en cualquier instancia del momento.
Al utilizar este complemento en el navegador, si no incluye moment.js en su página primero, deberá llamar manualmente window.momentDurationFormatSetup
en su instancia de momento una vez creada.
Para utilizar este complemento como módulo, utilice la función require
.
var moment = require ( "moment" ) ;
var momentDurationFormatSetup = require ( "moment-duration-format" ) ;
El complemento exporta la función init para que el formato de duración pueda inicializarse en otras instancias de momento.
Para usar este complemento con cualquier otro paquete moment.js, por ejemplo moment-timezone
, llame manualmente a la función de configuración exportada para instalar el complemento en el paquete deseado.
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
El método duration.fn.format
puede formatear la duración de cualquier momento. Si no se proporciona ninguna plantilla u otros argumentos, la función de plantilla predeterminada generará una cadena de plantilla basada en el valor de la duración.
moment . duration ( 123 , "minutes" ) . format ( ) ;
// "2:03:00"
moment . duration ( 123 , "months" ) . format ( ) ;
// "10 years, 3 months"
El método de formato de duración se puede llamar con tres argumentos opcionales y devuelve una cadena formateada.
moment . duration ( value , units ) . format ( [ template ] [ , precision ] [ , settings ] )
// formattedString
moment . duration . format
El método duration.format
permite el formato coordinado de múltiples duraciones de momentos a la vez. Esta función acepta una matriz de duraciones como primer argumento, luego los mismos tres argumentos opcionales que la función duration.fn.format
. Esta función devuelve una matriz de cadenas formateadas.
moment . duration . format ( durationsArray , [ template ] [ , precision ] [ , settings ] ) ;
// formattedStringsArray
Todas las opciones que están disponibles para la función de formato de duración única se pueden utilizar con la función de formato de duración múltiple. Se utiliza un único objeto de configuración para dar formato a cada una de las duraciones individuales.
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"]
Las duraciones no válidas se tratan como si tuvieran un valor de 0
para el formato.
var invalidDuration = moment . duration ( NaN , "second" ) ;
invalidDuration . isValid ( ) ;
// false
invalidDuration . format ( ) ;
// "0 seconds"
template
(cadena|función) es la cadena utilizada para crear la salida formateada, o una función que devuelve la cadena que se utilizará como plantilla de formato.
moment . duration ( 123 , "minutes" ) . format ( "h:mm" ) ;
// "2:03"
La cadena de plantilla se analiza en busca de caracteres de token de momento, que se reemplazan con el valor de duración para cada tipo de unidad. Las fichas de momento son:
years: Y or y
months: M
weeks: W or w
days: D or d
hours: H or h
minutes: m
seconds: s
ms: S
Escapar los caracteres del token dentro de la cadena de plantilla usando corchetes.
moment . duration ( 123 , "minutes" ) . format ( "h [hrs], m [min]" ) ;
// "2 hrs, 3 mins"
Para algunos formatos de duración de tiempo, se requiere un valor relleno con ceros. Utilice varios caracteres simbólicos juntos para crear la cantidad correcta de relleno.
moment . duration ( 3661 , "seconds" ) . format ( "h:mm:ss" ) ;
// "1:01:01"
moment . duration ( 15 , "seconds" ) . format ( "sss [s]" ) ;
// "015 s"
Cuando se recorta la plantilla de formato, también se puede recortar la longitud del token en el token renderizado de mayor magnitud. Consulte las secciones de recorte y fuerza de longitud a continuación para obtener más detalles.
moment . duration ( 123 , "seconds" ) . format ( "h:mm:ss" ) ;
// "2:03"
La longitud del token de 2
para milisegundos es un caso especial, que probablemente se usa para representar milisegundos como parte de una salida de temporizador, como mm:ss:SS
. En este caso, el valor de milisegundos se completa con tres dígitos y luego se trunca desde la izquierda para generar una salida de dos 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"
Los tokens pueden aparecer varias veces en la plantilla de formato, pero todas las instancias deben tener la misma longitud. Si no es así, todas las instancias se representarán con la longitud del primer token de ese 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"
La función de plantilla predeterminada intenta formatear una duración según su magnitud. Cuanto mayor sea el valor de duración, mayores serán las unidades de la salida formateada.
Para algunos valores de duración, la función de plantilla predeterminada se trim
de forma predeterminada a "both"
si esa opción no está configurada en el objeto de configuración (más sobre esto a continuación).
La función de plantilla predeterminada utiliza etiquetas de unidades localizadas automáticamente (más información sobre esto a continuación).
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"
Utilice una función de plantilla personalizada si necesita control en tiempo de ejecución sobre la cadena de plantilla. Las funciones de plantilla se ejecutan con un enlace this
del objeto de configuración y tienen acceso al objeto de duración subyacente a través de this.duration
. Se puede acceder a cualquiera de las configuraciones o modificarlas mediante la función de plantilla.
Esta función de plantilla personalizada utiliza una plantilla diferente según el valor de la duración:
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 garantizar una salida formateada fácil de usar, los caracteres de puntuación se recortan desde el principio y el final de la salida formateada. Específicamente, período inicial y final .
, coma ,
, dos puntos :
y espacio
Se eliminan los personajes.
precision
(número) define el número de fracciones decimales o dígitos enteros que se mostrarán para el valor final.
El valor de precisión predeterminado es 0
.
moment . duration ( 123 , "minutes" ) . format ( "h [hrs]" ) ;
// "2 hrs"
La precisión positiva define el número de dígitos de fracción decimal que se mostrarán.
moment . duration ( 123 , "minutes" ) . format ( "h [hrs]" , 2 ) ;
// "2.05 hrs"
La precisión negativa define el número de dígitos enteros que se truncarán a cero.
moment . duration ( 223 , "minutes" ) . format ( "m [min]" , - 2 ) ;
// "200 mins"
settings
es un objeto que puede anular cualquiera de las opciones de formato de duración de momento predeterminadas.
Tanto los argumentos template
como precision
se pueden especificar como propiedades de un único argumento de objeto de settings
, o se pueden pasar por separado junto con un objeto de configuración opcional.
moment . duration ( 123 , "minutes" ) . format ( {
template : "h [hrs]" ,
precision : 2
} ) ;
// "2.05 hrs"
El comportamiento trim
predeterminado es "large"
.
Los tokens de mayor magnitud se recortan automáticamente cuando no tienen valor.
moment . duration ( 123 , "minutes" ) . format ( "d[d] h:mm:ss" ) ;
// "2:03:00"
El recorte también funciona cuando la cadena de formato está orientada con la magnitud del token aumentando de izquierda a derecha.
moment . duration ( 123 , "minutes" ) . format ( "s [seconds], m [minutes], h [hours], d [days]" ) ;
// "0 seconds, 3 minutes, 2 hours"
Para dejar de recortar por completo, configure { trim: false }
.
moment . duration ( 123 , "minutes" ) . format ( "d[d] h:mm:ss" , {
trim : false
} ) ;
// "0d 2:03:00"
Al formatear varias duraciones usando moment.duration.format
, el recorte de todas las duraciones se coordina en la unión del conjunto de duraciones.
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
puede ser una cadena, una lista delimitada de cadenas, una matriz de cadenas o un valor booleano. Los valores aceptados son los siguientes:
"large"
Recorte los tokens de valor cero de mayor magnitud hasta encontrar un token con un valor, un token identificado como stopTrim
o el token final de la cadena de formato. Este es el valor trim
predeterminado.
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"
Recorte los tokens de valor cero de magnitud más pequeña hasta encontrar un token con un valor, un token identificado como stopTrim
o el token final de la cadena 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"
Ejecute un recorte "large"
y luego un recorte "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"
Recorta cualquier token de valor cero que no sea el primero ni el último. Generalmente se usa junto con "large"
o "both"
. por ejemplo, "large mid"
o "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"
Recorta la ficha final si tiene valor cero. Utilice esta opción con "large"
o "both"
para generar una cadena vacía al formatear una duración de valor cero. por ejemplo, "large final"
o "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"
Recorta todas las fichas de valor cero. "both mid final"
.
moment . duration ( 0 , "minutes" ) . format ( "d[d] h[h] m[m] s[s]" , {
trim : "all"
} ) ;
// ""
"left"
Se asigna a "large"
para admitir la API de la versión 1 de este complemento.
"right"
Se asigna a "large"
para admitir la API de la versión 1 de este complemento.
true
Mapas a "large"
.
null
Mapas a "large"
.
false
Desactiva el recorte.
Establezca largest
en un entero positivo para generar solo los n
tokens de momento de mayor magnitud, comenzando con el token de mayor magnitud que tenga un valor.
El uso de la opción largest
tiene como valor predeterminado trim
a "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"
Configurar trim
en un valor diferente o usar stopTrim
puede cambiar el token inicial así como la salida 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