Moment: formato de duración

Creado en 5 sept. 2013  ·  118Comentarios  ·  Fuente: moment/moment

Hemos abordado esto antes en los números 463 y 879, pero en realidad nunca hablamos de ello directamente en su propio número.

Necesitamos un método para formatear duraciones similar a cómo formateamos fechas. Debería ser tan simple como:

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

Tenga en cuenta que los tokens de formato tendrían que tener un significado ligeramente diferente, ya que estamos representando una duración de tiempo transcurrido, en lugar de una hora del día. Sugiero lo siguiente:

  • hh significaría "horas restantes después de contabilizar los días"
  • h sería la forma de un solo dígito de hh
  • HH significaría "total de horas completas"
  • H sería la forma de un solo dígito de HH
  • HHH significaría "total de horas, incluidos los decimales", aunque actualmente se puede hacer con duration.asHours() , por lo que podría no ser necesario.

Se aplicaría un formato similar para otras unidades. En este contexto, la unidad más alta sería un "día", que sería un día estándar que constaría de 24 horas estándar. No tendría sentido medir años o meses con esto debido a problemas de calendario.

Tenga en cuenta que esto surgió recientemente (nuevamente) en StackOverflow en esta pregunta . El usuario buscaba algo como duration.format("H:mm:ss") . Esta es la solución:

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

Esto funciona, pero se siente raro. Esto debería estar integrado.

New Feature Up-For-Grabs

Comentario más útil

¿No es mejor hacer

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

en vez de

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

Todos 118 comentarios

+1

moment.duration(x).format("H:mm:ss") era exactamente lo que esperaba, antes de entender que no funcionaría. La solución alternativa sugerida por Matt funcionó bien, pero en comparación con la elegancia de otras cosas en momentjs, seguro que parece extraño.

¿No es mejor hacer

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

en vez de

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

Code Bounty

@RobinvdVleuten : el problema con el uso de HH en el formateador actual es que representa la _porción_ de hora de una fecha y hora completas. Cuando se trata de un tiempo _transcurrido_, bien podría haber 24 horas o más. Prueba a pasar 24 horas y verás que se pone a cero.

Lo noté de hecho. Ahora estoy usando los milisegundos calculados para formatearlo, pero sigue siendo una solución complicada.

¿Está pensando que solo habrá un "nivel" de resto posible, por ejemplo, no hay forma de decir "horas después de contabilizar meses"? Creo que es una limitación perfectamente razonable, pero solo para escupir un segundo, podría imaginar proporcionar un argumento de "anclaje", así:

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

Lo que nos dice que las horas deben ser módulo el mes. El ancla es opcional y por defecto sería la unidad más grande más un tamaño (en este caso, días). De manera similar, podría usar la propia cadena para determinar que los minutos son módulo las horas y los segundos módulo minutos. Mientras que si hicieras esto:

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

...los segundos serían módulo de las horas.

Probablemente no sea una gran idea: no está solucionado (¿dónde van las semanas en esta jerarquía?) Y probablemente sea innecesario (es poco probable que la gente quiera agujeros como ese). Pero es divertido pensar en ello.

En una nota más seria, ¿cómo va a lidiar con el mes frente a los minutos con esta notación en minúsculas/mayúsculas?

Estaba imaginando que los días serían el tamaño máximo de unidad, por lo que los meses no entrarían en escena. Básicamente, esto es lo contrario de cómo analizamos las duraciones provenientes de los intervalos de tiempo de asp.net.

Tiene sentido.

He estado leyendo un documento SCORM 2004 RTE (p77) y descubrí que la representación del intervalo de tiempo es la siguiente, creo que esto proviene de un estándar,

en teoría puedo pasar un valor como: P34H
y los analizadores deben interpretar eso como 1 día y 10 horas

espero que sea posible formatear la salida con esto en mente
como 'PHM'
y el formateador interpreta eso como el total de Horas minutos restantes?
me gustaría poder formatear la salida como HH: MM

Espero que esta información sea útil.

intervalo de tiempo (segundo, 10,2): El intervalo de tiempo (segundo, 10, 2) indica que el valor de
el intervalo de tiempo del elemento del modelo de datos representa el tiempo transcurrido con una precisión de 0,01
segundos[1]. El enlace de notación de puntos SCORM define un formato particular para un
cadena de caracteres para representar un intervalo de tiempo.
El formato de la cadena de caracteres será el siguiente:
P[yY][mM][dD][T[hH][nM][s[.s]S]] donde:
• y: El número de años (entero, >= 0, no restringido)
• m: El número de meses (entero, >=0, no restringido)
• d: El número de días (entero, >=0, no restringido)
• h: El número de horas (entero, >=0, no restringido)
• n: El número de minutos (entero, >=0, no restringido)
• s: El número de segundos o fracción de segundos (real o entero, >=0, no
restringido). Si se usan fracciones de segundo, SCORM restringe aún más la cadena a
un máximo de 2 dígitos (p. ej., 34,45: válido, 34,45454545: no válido).
• Los designadores de literales de caracteres P, Y, M, D, T, H, Man y S aparecerán si el
el valor distinto de cero correspondiente está presente.
• Se admitirá el relleno con ceros de los valores. El relleno cero no cambia el
valor entero del número representado por un conjunto de caracteres. Para
ejemplo, PT05H es equivalente a PT5H y PT000005H.
Ejemplo:
• P1Y3M2DT3H indica un período de tiempo de 1 año, 3 meses, 2 días y 3 horas
• PT3H5M indica un período de tiempo de 3 horas y 5 minutos

Los implementadores deben ser conscientes de que el formato y el enlace son para la comunicación de
los datos entre un SCO y un LMS. Dado que el formato representa un período de tiempo,
entonces una duración como PT5M es equivalente a PT300S.
Si el elemento del modelo de datos, que es de tipo timeinterval(second,10,2) contiene un valor, entonces
• El designador P estará presente;
• Si el valor de años, meses, días, horas, minutos o segundos es cero, el valor
y la designación literal del carácter correspondiente puede omitirse, pero al menos uno
el designador de carácter literal y el valor estarán presentes además del designador
PAGS;
• El designador T se omitirá si todos los componentes de tiempo (horas, minutos
y segundos) no se utilizan. Se puede usar un valor cero con cualquier tiempo
componentes (p. ej., PT0S).

El formato de duración sería una excelente adición. No hay necesidad de dos tokens de "hora" distintos. Suponga una duración de 32 horas. Nunca querrías extraer solo 8 horas sin extraer también 1 día.

Creo que @icambron tiene una buena sugerencia. Analice la cadena de formato en tokens y exprese la duración en términos de la unidad más grande. Analice los tokens uno a la vez en orden (p. ej., "DD:hh:ss" que significa número de días completos, número de horas completas después de contabilizar los días, número de segundos completos después de contabilizar los días + horas).

He publicado un complemento moment.duration.format:
https://github.com/jsmreese/moment-duration-format

Creo que aborda la mayoría de las ideas/casos de uso en este hilo.

@jsmreese ¿Ha considerado presentar una solicitud de extracción que contenga su complemento como parte central de momentjs?

@hotzenklotz Sí, he considerado presentar una solicitud de incorporación de cambios.

No lo he hecho por todas las razones que @icambron expuso en el #1538.

Mi complemento:

  • depende de Lo-Dash
  • no se ve ni se siente como el código Moment.js
  • utiliza una configuración de prueba completamente diferente

Me encantaría que mi complemento se convirtiera en parte del núcleo de Moment.js... pero no voy a hacerles perder el tiempo con una solicitud de incorporación de cambios antes de que se resuelvan esos problemas.

También nos gustaría asegurarnos de que el código se pueda internacionalizar. Afortunadamente, la mayoría de las cadenas que necesitaríamos están en Unicode CLDR, por lo que debería ser necesario muy poco trabajo de traducción.

El CLDR también tiene recomendaciones específicas de la localidad sobre cómo formatear ciertos tipos de intervalos, lo que podría ser potencialmente más útil que los formatos de duración arbitraria. No estoy seguro de cómo encaja eso aquí, pero puede ser bueno poder mostrar automáticamente intervalos específicos del lugar entre dos horas específicas.

El CLDR también tiene información sobre cómo mostrar intervalos de tiempo específicos (en lugar de duraciones) que podrían ser útiles en algún momento...

Datos del calendario en inglés (EE. UU.)

Acabo de publicar una nueva versión de Moment Duration Format que elimina la dependencia anterior de Lo-Dash o Underscore.

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

@jsmreese Se adapta perfectamente a nuestras necesidades. ¡Gracias!

+1

+1

+1

+1

+1

+1

+1

+1

Probablemente suene como un disco rayado en este tema, pero me gustaría asegurarme de que cualquier solución siga las convenciones existentes siempre que sea posible y pueda internacionalizarse fácilmente (lo que incluye agregar símbolos similares a LLLL para formatos de duración de uso común .

Algo molesto, el CLDR no proporciona muchas pautas específicas para formatear duraciones, aunque existen extensas pautas de intervalos y duración relativa que podrían ser útiles para el momento en otro lugar. Sin embargo, proporcionan algunas pautas y traducciones mínimas para las unidades de duración , lo que le permitiría concatenar las unidades relevantes al implementar algo como humanize() .

La sintaxis hh / h descrita anteriormente se siente como una desviación significativa de los tokens de formato utilizados por ISO8601, CLDR y Apache , y preferiría evitarla si es posible.

Una mejor propuesta podría ser inferir el uso de la unidad más significativa en el patrón de formato como módulo, por lo que h:mm:ss mostraría una hora "normal", pero contaría las horas pasadas las 24 (por ejemplo, 26:30:00). No está claro cómo se calcularía un patrón como "HH:MM:ss" , o cuál sería el caso de uso para eso. Permitir que los desarrolladores anulen este comportamiento también parece que podría convertirse fácilmente en una fuente de errores.

Manteniendo el espíritu de "i18n en todas partes", CLDR define formatos de duración para:

  • Horas + minutos ( h:mm en EN-US)
  • Horas + minutos + segundo ( h:mm:ss en EN-US)
  • Minutos + segundos ( m:ss en EN-US)
    y podría tener sentido proporcionar constantes específicas del lugar (similares a los formatos de fecha LLL ) para estas duraciones de tiempo.

Desafortunadamente, formatear duraciones con unidades mayores que horas es realmente difícil de expresar a través de una sola cadena de formato (gracias a las reglas de pluralización que debe tener en cuenta), y no pude encontrar _ninguna_ biblioteca en ningún idioma que permita formateo fácil y compatible con i18n de duraciones superiores a 24 horas. Lo mejor que puede hacer sería extender duration.humanize() para tomar algunos parámetros adicionales, implementando efectivamente la propuesta original en #463.

En resumen, puede que no sea una buena idea implementar duration.format() , ya que veo que cualquier solución potencial tiene inconvenientes considerables. Su mejor opción sería mejorar duration.humanize() o implementar un duration.format() reducido que solo comprenda horas, minutos y segundos.

+1

En caso de que necesite una función rápida para agregar relleno:

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: ¡el momento sorprendido no hace esto, por lo general nunca me ha fallado!

+1 He usado el formato de duración de momento, mencionado anteriormente, pero no está internacionalizado. Estoy tratando de generar días y es probable que también necesite meses, que realmente necesitan etiquetas.

¿Hay algún progreso con este tema?

+1

+1

+1

+1

:+1:

+1
¿Por qué todavía no está en el núcleo?

+1 +1 +1 +1 +1

+1

+2

@jsmreese , ¿su complemento es compatible con i18n?

@rumeshwick : ¿quizás? Eso realmente depende de cómo lo esté haciendo i18n y de lo que espera de mi complemento.

+1

Descubrí que es posible de esta manera hacky:

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

Esto produce:

"son 1 día y 1 hora"

Sin embargo, no puede imprimir algo como "son 1 días y 90 minutos".
Para mis propósitos esto es suficiente.
No incluye i18n pero en mi caso no quiero que esto lo solucione moment.js.

Hola, tengo un ayudante de Ember.JS aquí para esto:

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

+1

+1 por la manera hacky de @vanthome :+1:

@jsmreese : ¿estaría interesado en fusionar su complemento en el núcleo de momento? Sería muy útil, y muy apreciado.

Tendría que reformatearse para adaptarse a la nueva implementación de ES6 y reemplazar algunas funciones redundantes con el equivalente de Moment, pero en general creo que sería bastante fácil.

@ mj1856 definitivamente interesado. Te haré un ping por correo electrónico con algunas preguntas.

¡Hurra! ¡¡¡Bien hecho, @jsmreese y @mj1856!!! :aplaude aplaude aplaude:

Vine aquí solo para proponer fusionar el complemento de @jsmreese con moment js.

+1

+1

Dado que parece que @jsmreese tiene poco tiempo, estoy marcando esto como disponible. Esencialmente, el PR propuesto debe implementar toda la funcionalidad del complemento de formato de duración de momento de @jsmreese , pero debe ajustarse al estilo ES2015 que ahora se usa en moment.js, y debe reutilizar la mayor parte del momento existente. js funcionalidad para minimizar el tamaño del código.

+1

Una característica de la que carece el complemento de formato de duración de momento de @jsmreese es la capacidad de reconstruir un objeto de duración a partir de la cadena formateada.

hola @ mj1856 , estoy interesado en abordar la integración del complemento de formato en moment. ¿Cómo funciona la contribución aquí con la etiqueta Up-For-Grabs ? ¿Debería simplemente trabajar en ella y enviar el PR a la sucursal develop , o alguien más lo ha reclamado?

@joshrowley no se reclama, pero serías un héroe si lo hicieras. Adelante, tómalo y, cuando estés listo, envía un pull. Este será un poco más complicado que otros disponibles, por lo que si lo desea, no dude en enviar una solicitud de extracción para su revisión antes de que termine; estaremos atentos. Seremos exigentes con respecto a no aumentar el tamaño de la biblioteca con este; ya es más grande de lo que nos gustaría. Por favor, tenga en cuenta eso.

Tal vez lo maneje también (o en su lugar), pero primero debo encajar en la estructura de desarrollo de momento completo.

Trabajo en proceso PR: #3308

Hola amigos, abrí un PR en el n.° 3615 y me encantaría tener algunos ojos en él.

tal vez esto esté relacionado - problemas encontrados:
momento.duración(3500000).format("hh:mm", { forceLength: true })
que muestra el resultado: 58, en lugar 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");

Otro truco más para formatear duraciones....

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

+1

Tenga en cuenta que los trucos publicados por @fabiogalera y @befreestudios parecen funcionar bien durante menos de 24 horas, pero ninguno funciona durante más de 24 horas.

EDITAR: Esto parece deberse a que está en una versión anterior de Moment. Acabo de intentarlo de nuevo con la última versión y funciona como se esperaba. Perdón por la confusion.
-
También encontré algunos errores de redondeo extraños/casos extremos con el truco original publicado por @ mj1856 en la parte superior de este hilo. Por ejemplo, pruebe con 2,3 o 4,1 horas. Esos son valores decimales que deben dividirse uniformemente en una cantidad de minutos.

Por ejemplo, 2.3 debería ser exactamente 2:18:00 pero obtendrá 2:17:59. Y 4.1 debería ser exactamente 4:06:00, pero obtendrás 4:05:59. Esto parece deberse a que los métodos duration.asXXX() tienen algunos problemas de precisión/redondeo. ¿Alguien más ha visto esto y tiene alguna sugerencia?

Aquí está mi función para el formato de duración basado en el formato de fecha (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);
        };

uso: momento.duración(10000).formato("hh:mm:ss:l")

+1

¿Alguna noticia aquí, tendrá momento esta funcionalidad? ¿Cuál es el consenso?

+1

Volviendo a chocar, es como el cuarto proyecto en el que quería usar esa función. Espero verlo implementado en moment.js muy pronto.

+1

He estado pendiente de esto durante mucho tiempo con la esperanza de que esta función se implemente. ¿Hay algún trabajo en progreso sobre esto?

Por lo que sé, está funcionando en este momento, lo tengo en mi aplicación, consulte los documentos:
https://momentjs.com/docs/#/duraciones/

@luchillo17 ¿Hablas de duraciones, en general, de trabajo?

Bueno, acabo de intentar 5 minutos atrás y estaba funcionando.

Bueno, solo quería ser claro sobre lo que estamos hablando aquí. Duraciones _hacen_ trabajo. Este problema trata sobre el formato de las duraciones.

Mala mía, el hilo es tan grande que me perdí en la bajada.

Sin embargo, ahora que miro más de cerca, hay un complemento para el formato de duración del momento que figura en los documentos:
https://momentjs.com/docs/#/plugins/duración-formato/

¿Es eso lo que ustedes esperan? parece que incluso tiene definiciones de tipo TypeScript.

Y lo he probado, funciona bastante bien.

El complemento funciona muy bien. Me encantaría verlo fusionado con Moment.js. No puedo ver cómo las duraciones son útiles sin él.

Es un complemento porque no todas las personas usan la duración, no veo una gran cantidad de usuarios que necesiten duraciones para justificar el aumento de la base del código.

Incluso me sorprende que el módulo de duración completo no esté en un complemento.

O eso. Actualmente, el módulo de duración no tiene sentido para mí. Todas las funciones que contiene son matemáticas simples que se pueden hacer muy bien sin una biblioteca.
Si el complemento se fusionó, entonces puedo ver que tiene un buen uso.

Tal vez, pero no pensar en que las matemáticas son buenas para las bibliotecas, soluciones probadas en batalla para que usted y yo no tengamos que perder el tiempo en tales tareas, como por ejemplo, no sabía que había tantos estándares para la duración, como ISO 8601, el módulo de duraciones se ocupa de eso por mí, así que no necesito saber cómo se define ese estándar.

Supongo que sí.
De cualquier manera, propongo que hagamos referencia al complemento en la documentación.
De esa manera, las personas saben que la funcionalidad está ahí y no tienen que ir a Google y buscar esta funcionalidad.

De hecho, me tomó un tiempo encontrar la sección de complementos para ello.

4 años y todavía no hay reacción de los dueños... Eso es triste :(

Hola amigos,

Esto es algo en lo que todavía estamos trabajando. ¡Moment es una comunidad de voluntarios! Necesitamos asegurarnos de que una característica como esta tenga estas propiedades:
1) funciona en todos los entornos
2) no agrega demasiado volumen al código
3) no reinventa la rueda (es decir, ¡ya hay un complemento para hacer esto!)
4) no rompe las características existentes

Es posible que esto se fusione en algún momento.
https://github.com/moment/moment/pull/3615

Si cree que los documentos podrían señalar mejor el complemento de formato de duración (¡u otros complementos!), Envíe un PR aquí: https://github.com/moment/momentjs.com/

@marwahaha

no agrega demasiado volumen al código
no reinventa la rueda (es decir, ¡ya hay un complemento para hacer esto!)

Bueno, dado que ya existe un complemento de formato de duración y una duración dentro de la biblioteca de momentos, ¿quizás la mejor solución es sacar la duración de moment.js en un complemento separado y luego implementar todas las cosas "pesadas" dentro de ese complemento?
Con ello se conseguirán 2 objetivos:
1) disminuir el tamaño de moment.js
2) proporcionar duración directamente con las funciones más útiles en lugar de una versión muy limitada.

Un gran desafío es que el formato de duración será muy difícil de implementar en toda la gama de configuraciones regionales que admite moment.js.

Odiaría ver que esas configuraciones regionales pierdan el soporte de duración limitada que tienen actualmente, o que Moment agregue una función que solo funciona correctamente en algunas configuraciones regionales. Mantener el formato de duración en un complemento parece un buen término medio que garantiza que el "núcleo" de moment.js sea estable y funcione para todos, al tiempo que brinda a los usuarios de una sola configuración regional la opción de usar complementos que realizan funciones específicas para su configuración regional. .

El complemento de formato de duración ya existe y se menciona dentro de la documentación. Eso es más que suficiente.

@OogieBoogieInJSON Bueno, los documentos no son tan útiles, básicamente tuve que verificar este problema incluso antes de llegar a los complementos en los documentos, hay poca exposición a esas funciones a menos que realmente intente leer los documentos completos, lo que ciertamente nadie hace.

@ luchillo17 Leo todos los documentos antes de trabajar con algo. Probablemente, solo soy yo.

Jaja, sí, es genial que lo hagas, todos deberían hacerlo, pero la mayoría de nosotros, como desarrolladores, tenemos horarios que cumplir, por lo que comprender cada detalle de todas las bibliotecas que usamos no es práctico.

@luchillo17 No es culpa de la documentación que haces Programación Orientada a la Gestión. ¡Salud!

Para aquellos que siguen la saga de formatear la duración de los momentos, he publicado la versión 2.0.0 de mi complemento de formato de duración de momento.

La nueva versión resuelve/incorpora casi todos los problemas y comentarios de los últimos cuatro años, la versión 1 ha estado disponible, incluida la localización y el soporte de pluralización, así como algunas opciones de formato útiles.

Compruébalo aquí: https://github.com/jsmreese/moment-duration-format/releases

El verdadero MVP -> @jsmreese

Ja. Gracias por las amables palabras, @OogieBoogieInJSON.

No puedo dejar de notar que mi complemento se destaca, y no existiría sin, los enormes esfuerzos de los creadores y mantenedores de moment, sin mencionar los muchos, muchos colaboradores. ¡Tomarme el tiempo ahora para revisar algo que creé hace cuatro años (wow, realmente ha pasado tanto tiempo!) francamente palidece en comparación con su continuo pastoreo de este proyecto.

Aaaaay se publica la versión 2.1.0.
https://github.com/jsmreese/moment-duration-format/releases

La versión actualizada soluciona algunos problemas de la versión 2.0 e introduce moment.duration.format , una nueva función para el formato coordinado de varias duraciones. No debe confundirse con el moment.duration.fn.format ya existente.

La nueva función toma una matriz de duraciones y devuelve una matriz de cadenas formateadas, y es útil siempre que tenga un grupo de duraciones que deben formatearse juntas de manera coherente.

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 provocó algunos errores anteriormente, así que tuve que bloquearlo en 1.3.0 por seguridad, sin embargo, gracias por mantener viva la característica/proyecto.

@prusswan , pruebe la versión 2.1.0. ¡Me gustaría saber si todavía ve esos errores!

He publicado la versión 2.2.0 de moment-duration-format, que ahora incluye una función de formato de número alternativo porque toLocaleString no está completamente implementado en muchos entornos.

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

Probé la nueva versión usando BrowserStack en una variedad de dispositivos Android con versiones de SO de 2.2 a 7, y en una variedad de dispositivos iOS con versiones de SO de 4.3 a 11. También probé en Chrome, Firefox, IE 8-11, y navegadores Edge.

@prusswan y otros que tuvieron que bloquear la versión en 1.3.0 , es probable que encuentren que la versión 2.2.0 es finalmente el reemplazo directo que se suponía que era la versión 2.0.0.

¡Gracias a todos los que han registrado problemas con la versión 2 de este complemento!

Habiendo implementado la versión 2 del complemento de formato de duración de momento, hay algunas mejoras obvias para una versión 3.

He enumerado mis ideas a continuación y las he agregado como problemas en el repositorio . Si tienes ideas o comentarios sobre lo que te gustaría ver, ¡házmelo saber!

Esperemos que la próxima versión se publique en algo así como 4 meses... no la espera de 4 años para la versión 2.

  • Las opciones de localización de formato de números alternativos deben incluirse con las extensiones de objeto Moment Locale que ya hice para localizar etiquetas de unidades de duración. Esto pondrí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 toLocaleString directamente en lugar de ocultar algunas de las opciones y enmascararlas detrás precision y useSignificantDigits opciones.

  • Exponer la función de formateo de números alternativos, así como la función de prueba de características toLocaleString , facilitaría las pruebas y permitiría su uso fuera del contexto de las duraciones de formateo.

  • Agregue definiciones de tipo para admitir TypeScript, publique el paquete NuGet y admita cualquier otra opción de empaquetado que esté en uso en estos días. (Esto no tiene que esperar hasta la versión 3.)

  • Las pruebas del complemento deben modernizarse, idealmente para que coincidan con la configuración de pruebas de Moment.js. (Esto tampoco tiene que esperar hasta la versión 3).

@jsmreese Un trabajo tremendo, pero no te sientas presionado a subir la versión principal dos veces en un corto período de tiempo. Si todavía está en uso después de 4 años sin una actualización, entonces probablemente sea lo suficientemente bueno. Siento que este problema actual se puede cerrar ya que ya hay una resolución (use los complementos). Se puede iniciar un nuevo tema para decidir si esta funcionalidad debe convertirse en parte del propio momento.

@jsmreese Increíble. ¡Muchas gracias y justo a tiempo! Gran cosa para mí y gracias por todo lo que haces.

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

Gracias por toda la discusión aquí.

¿Fue útil esta página
0 / 5 - 0 calificaciones