Moment: obtener formato localizado con mes y días solamente

Creado en 1 ago. 2016  ·  20Comentarios  ·  Fuente: moment/moment

Miré los archivos de origen de la configuración regional y no pude encontrar un formato para mostrar el mes y el día solo sin la información del año. Un ejemplo del archivo locale / zh-cn.js

longDateFormat : {
    LT : 'Ah点mm分',
    LTS : 'Ah点m分s秒',
    L : 'YYYY-MM-DD',
    LL : 'YYYY年MMMD日',
    LLL : 'YYYY年MMMD日Ah点mm分',
    LLLL : 'YYYY年MMMD日ddddAh点mm分',
    l : 'YYYY-MM-DD',
    ll : 'YYYY年MMMD日',
    lll : 'YYYY年MMMD日Ah点mm分',
    llll : 'YYYY年MMMD日ddddAh点mm分'
},

Todos los formatos de lista tienen año. ¿Puede admitir algún formato como LM o lm: 'MMMD 日'?

Por favor avise.

Enhancement

Comentario más útil

Usamos esta expresión regular para superar este problema

moment().format('L').replace(new RegExp('[^\.]?' + moment().format('YYYY') + '.?'), '')

Hace las siguientes conversiones
05/04/2017 -> 05/04 (por ejemplo, nosotros, gb)
2017-04-03 -> 04-03 (por ejemplo, swe)
8.7.2017 -> 8.7.2017 (por ejemplo, aleta)

Todos 20 comentarios

Actualmente, no ofrecemos un token de formato localizado que sea solo de mes y día. Esto requeriría una expansión significativa de los datos, ya que es probable que haya más de una forma de mostrar esto en varias configuraciones regionales.

Probablemente sea más fácil usar un formato personalizado en lugar de intentar ajustarlo a los formatos locales.

También necesito este tipo de formato.
No quiero personalizarlo, ya que debería corregirse en todas las configuraciones regionales :)

Aquí igual.

Solo para considerarlo, Intl.DateTimeFormat dice que la implementación debe admitir al menos los siguientes subconjuntos: (...) mes, día (...). Probablemente no sea relevante, pero parece que es importante tenerlo en cuenta para mensajes específicos de la configuración regional.

Acabo de echar un vistazo a todos los archivos de idioma y para la mayoría de los idiomas esto parece bastante fácil ...
@ mj1856 ¿

@kaljak agregar el formato es fácil, pero ¿de dónde

También desde aquí: https://github.com/andyearnshaw/Intl.js/blob/master/locale-data/json/ , o desde https://github.com/unicode-cldr/cldr-dates-full/ ( que también incluyen versiones cortas / estrechas para tiempos relativos, lo que sería una gran adición :)).

No relacionado, pero tal vez en algún momento tenga sentido derivar formatos específicos de la configuración regional de Intl.DateTimeFormat y evitar incluir los datos de la configuración regional específicos del momento.

Yo también necesitaría esto.

Usamos esta expresión regular para superar este problema

moment().format('L').replace(new RegExp('[^\.]?' + moment().format('YYYY') + '.?'), '')

Hace las siguientes conversiones
05/04/2017 -> 05/04 (por ejemplo, nosotros, gb)
2017-04-03 -> 04-03 (por ejemplo, swe)
8.7.2017 -> 8.7.2017 (por ejemplo, aleta)

+1 en esto.

Nuestro sitio web muestra algo como esto en un formato localizado:
Jan 5

No hay una buena manera de mostrar esta cadena en un idioma como el español que debería verse así:
5 de Jan sin cortar el texto del año, que parece imposible de mantener debido a las diferencias de idioma.

Es decir, moment().locale('es')format('ll') // 5 de Jan de 2018

@stenvala ¡ Impresionante solución!

Cuando se usa con .format('ll') obtengo un sufijo , , ¿cómo puedo arreglar lo anterior para eliminarlo?

Por ejemplo: Jan 29, 2018 -> Jan 29,

Me encontré con la misma necesidad y, en lugar de una forma compatible, puse el siguiente código en una clase auxiliar que uso dentro de mis servicios y envuelto en una tubería angular para usar en plantillas. Su kilometraje puede ser muy elevado, pero revisé todos los archivos de configuración regional y creo que obtuve todas las diferentes permutaciones de usar el formato "ll" como base para el nuevo formato de mes y día. He probado con las siguientes configuraciones regionales: en, es, hy-am, hu, cv, ja, lv. Cada uno de ellos tenía permutaciones interesantes, incluidas letras Unicode en los nombres de los meses.

if (format.indexOf("YYYY") === 0) {
        // In some locales, the Year is presented first, along with various punctuation (period, comma) as well as sometimes
        // hard coded words in brackets. The RegEx below strips everything off that shouldn't be there related to the YYYY prefix.
        return format.replace(/YYYY(\.)?(\s)?(\[([^\x00-\x7F]|\w)+\])?(\s)?/gi, '');
    }

    // In other locales, the year is presented at the end (or almost end). It can have various punctuation around it as well
    // as hard coded words in brackets. The RegEx below strips everything off that shouldn't be there related to the YYYY suffix.
    return format.replace(/(\s)?,?(\[([^\x00-\x7F]|\w)+\])?(\s)?YYYY.*/gi, '');

¡Buena suerte!

PD: no soy un gurú de RegEx e hice todo lo posible con las expresiones anteriores. Parecen funcionar, pero probablemente podrían optimizarse.

Hice .format('MMMDo') para obtener lo que quiero al final, no genérico pero funciona bien en mi caso.

👍

¿Qué pasa con el uso de una fuente de datos que tiene la regla de formato para muchos idiomas? Los idiomas restantes obtienen un texto de marcador de posición p.ex. 'Hola desarrollador. Informe el formato de su idioma al proyecto moment.js. Gracias'

Por lo tanto, si algún desarrollador necesita la cadena de fecha corta y la usa, recibirá esta llamada a la acción y la brecha se cerrará a pedido.

Aquí hay otra solución con Intl . Personalice el objeto options para obtener el formato que desee. Intl.DateTimeFormat manejará todo el orden localizado de las cadenas y los separadores locales.

const localizedDateMonthNoYear = (moment) => {
    if (window && window.Intl && window.Intl.DateTimeFormat) {
      let options = {
        weekday: 'short',
        month: 'short',
        day: '2-digit',
      }
      return new Intl.DateTimeFormat('default', options).format(moment.toDate())
    }
    return moment.format('ll');
}

Durante 3 años, ningún movimiento sobre lo que es un problema crítico que evita que moment.js se considere completo como una biblioteca de formato de fecha / hora ... gracias a Dios por la API de Intl, que poco a poco se está convirtiendo en estándar.

Algunos de los desarrolladores principales de Moment.js ahora trabajan en propuestas de TC39, porque tienes razón, ¿por qué no tener algunas de estas funciones en el lenguaje principal?

Puede utilizar el método toLocaleDateString de JS Date. P.ej

const getFormattedDateTime = dateTime => dateTime.toLocaleDateString('ru-RU', {
  month: 'short',
  day: 'numeric',
  hour: 'numeric',
  minute: 'numeric',
})

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

No agregaremos nuevos tokens.

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