Moment: obtenir un format localisé avec le mois et les jours uniquement

Créé le 1 août 2016  ·  20Commentaires  ·  Source: moment/moment

J'ai regardé les fichiers sources des paramètres régionaux et je n'ai pas trouvé de format pour afficher le mois et le jour uniquement sans informations sur l'année. Un exemple du fichier 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分'
},

Les formats de liste ont tous l'année. Pouvez-vous prendre en charge certains formats comme LM ou lm : 'MMMD日' ?

S'il vous plaît donnez votre avis.

Enhancement

Commentaire le plus utile

Nous utilisons cette expression régulière pour surmonter ce problème

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

Il fait les conversions suivantes
05/04/2017 -> 05/04 (par exemple nous, gb)
2017-04-03 -> 04-03 (par exemple swe)
8.7.2017 -> 8.7. (ex. aileron)

Tous les 20 commentaires

Nous ne proposons actuellement pas de jeton au format localisé qui ne concerne que le mois et le jour. Cela nécessiterait une expansion significative des données, car il existe probablement plus d'une façon de les afficher dans divers paramètres régionaux.

Il est probablement plus facile d'utiliser un format personnalisé au lieu d'essayer de l'adapter aux formats régionaux.

J'ai aussi besoin de ce type de format.
Je ne veux pas le personnaliser car il devrait être corrigé dans tous les paramètres régionaux :)

Pareil ici.

Juste pour le considérer, Intl.DateTimeFormat indique que l'implémentation doit prendre en charge au moins les sous-ensembles suivants : (...) mois, jour (...). Probablement pas pertinent, mais il semble qu'il soit important de le considérer pour les messages spécifiques aux paramètres régionaux.

Je viens de jeter un œil à tous les fichiers de langue et pour la plupart des langues, cela semble assez facile...
@ mj1856 des idées sur la façon dont je pourrais commencer?

@kaljak ajouter le format est facile, mais où obtenez-vous les données pour savoir comment l'exprimer correctement dans la langue donnée ? Vous auriez besoin d'une source similaire au CLDR, ou de quelqu'un qui parle la langue pour le savoir.

Également à partir d'ici : https://github.com/andyearnshaw/Intl.js/blob/master/locale-data/json/ , ou de https://github.com/unicode-cldr/cldr-dates-full/ ( qui incluent également des versions courtes/étroites pour les temps relatifs, ce qui serait un excellent ajout :)).

Sans rapport, mais peut-être qu'à un moment donné, il serait judicieux de dériver des formats spécifiques aux paramètres régionaux à partir de Intl.DateTimeFormat et d'éviter d'inclure les données locales spécifiques au moment ?

J'aurais besoin de ça aussi.

Nous utilisons cette expression régulière pour surmonter ce problème

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

Il fait les conversions suivantes
05/04/2017 -> 05/04 (par exemple nous, gb)
2017-04-03 -> 04-03 (par exemple swe)
8.7.2017 -> 8.7. (ex. aileron)

+1 à ce sujet.

Notre site Web affiche quelque chose comme ceci dans un format localisé :
Jan 5

Il n'y a pas un bon moyen d'afficher cette chaîne dans une langue comme l'espagnol qui devrait ressembler à ceci :
5 de Jan sans découper le texte de l'année, ce qui semble impossible à maintenir en raison des différences de langue.

C'est-à-dire moment().locale('es')format('ll') // 5 de Jan de 2018

@stenvala Super solution !

Lorsqu'il est utilisé avec .format('ll') j'obtiens un suffixe , , comment puis-je corriger ce qui précède pour le supprimer ?

Ex : Jan 29, 2018 -> Jan 29,

J'ai rencontré le même besoin et, au lieu d'une méthode prise en charge, j'ai mis le code suivant dans une classe d'assistance que j'utilise dans mes services et enveloppé dans un tuyau angulaire à utiliser dans les modèles. Votre kilométrage peut être très important, mais j'ai examiné tous les fichiers de paramètres régionaux et je pense avoir obtenu toutes les différentes permutations de l'utilisation du format "ll" comme base du nouveau format Mois et Jour. J'ai testé les paramètres régionaux suivants : en, es, hy-am, hu, cv, ja, lv. Chacun de ceux-ci avait des permutations intéressantes, y compris des lettres unicode dans les noms de mois.

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, '');

Bonne chance!

PS - Je ne suis pas un gourou RegEx et j'ai fait de mon mieux avec les expressions ci-dessus. Ils semblent fonctionner, mais pourraient probablement être optimisés.

J'ai fait .format('MMMDo') pour obtenir ce que je veux à la fin, pas générique mais fonctionne bien dans mon cas.

??

qu'en est-il de l'utilisation d'une source de données qui a la règle de formatage pour un grand nombre de langues. Les langues restantes reçoivent un texte d'espace réservé p.ex. 'Salut développeur. veuillez signaler le formatage de votre langue au projet moment.js. Merci'

Ainsi, si un développeur a besoin de la chaîne de date courte et l'utilise, il recevra cet appel à l'action et l'écart sera comblé à la demande.

Voici une autre solution de contournement utilisant Intl . Personnalisez l'objet options pour obtenir le format souhaité. Intl.DateTimeFormat gérera tout l'ordre localisé des chaînes et les séparateurs locaux.

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');
}

Sur 3 ans, aucun mouvement sur ce qui est un problème critique qui empêche moment.js d'être considéré comme complet en tant que bibliothèque de formatage date/heure... Dieu merci pour l'API Intl qui devient lentement standard.

Certains des développeurs principaux de Moment.js travaillent désormais sur des propositions TC39, car vous avez raison, pourquoi ne pas avoir certaines de ces fonctionnalités dans le langage principal ?

Vous pouvez utiliser la méthode toLocaleDateString de JS Date. Par exemple

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

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

Nous n'ajouterons pas de nouveaux jetons.

Cette page vous a été utile?
0 / 5 - 0 notes