web-dev-qa-db-fra.com

Locale et format de date spécifique avec Moment.js

J'utilise Moment.js dans mon projet et les dates de formatage comme suit:

var locale = window.navigator.userLanguage || window.navigator.language;
moment.locale(locale);
someDate.format("L");

Cela fonctionne bien, mais il me faut parfois une date sans année. Je ne peux pas utiliser quelque chose comme someDate.format("MM/DD") car dans certaines langues, il devrait s'agir de someDate.format("DD/MM"). J'ai besoin de quelque chose comme L,LL,LLL mais sans année. 

Que puis-je faire?

LTS : 'h:mm:ss A',
LT : 'h:mm A',
L : 'MM/DD/YYYY',
LL : 'MMMM D, YYYY',
LLL : 'MMMM D, YYYY LT',
LLLL : 'dddd, MMMM D, YYYY LT'
31
Jekyll

D'accord. C'est un peu horrible, mais vous saviez que ça allait être.

Tout d'abord, vous pouvez accéder à la chaîne de format actuelle pour (par exemple) 'L':

var formatL = moment.localeData().longDateFormat('L');

Ensuite, vous pouvez effectuer une opération chirurgicale avec un remplacement judicieux des regex:

var formatYearlessL = formatL.replace(/Y/g,'').replace(/^\W|\W$|\W\W/,'');

(Ce qui revient à dire: retirez AAAA, plus le séparateur orphelin laissé par son retrait)

Ensuite, vous pouvez utiliser votre nouvelle chaîne de format dans un appel de format instant:

someDate.format(formatYearlessL);

Cela suppose nécessairement certaines hypothèses:

  • Le format numérique de l'ordre du mois et du jour d'une locale correspond à celui de l'ordre du format année + mois + jour de cette locale, l'année étant supprimée.
  • La forme abrégée utilise des séparateurs uniquement entre le mois et le jour (pas de séparateurs début/fin).
  • Le séparateur pour un format de date numérique court est toujours non alphanumérique.
  • Le format est composé d'éléments numériques et de séparateurs, plutôt que d'un format de phrase avec des articles (voir ci-dessous le commentaire de RGPT sur l'espagnol et le portugais, qui s'appliquera également aux formats longs dans d'autres langues).

Lors d’un examen rapide de locale/*.js, ces hypothèses sont valables pour tous les fichiers de paramètres régionaux que j’ai examinés, mais il se peut que certains paramètres régionaux les violent. (ETA: un commentaire ci-dessous indique qu'un format de date abrégé allemand enfreint la deuxième hypothèse.)

Autre mise en garde importante, celle-ci risque d'être fragile. Il est tout à fait possible qu'une future version de moment.js modifie l'emplacement des données actuellement dans longDateFormat...

21
S McCrohan

Autant que je sache, vous pouvez modifier le format de date (sans année) pour des langues spécifiques à l'aide de propriétés MomentJS https://momentjs.com/docs/#/customization/long-date-formats/

Exemple:

moment.updateLocale('en', {
  longDateFormat: {
    LLL: "MMMM Do, LT", // Oct 6th, 4:27 PM
  }
});

moment.updateLocale('ru', {
  longDateFormat: {
    LLL : 'D MMMM, HH:mm', // 6 окт., 16:27
  }
});
2
MegaCasper

La bibliothèque ne facilite pas l'ajout de nouveaux formats, car ils sont validés par une expression régulière que nous ne pouvons pas remplacer (var localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g;).

Cependant, nous pouvons remplacer la fonction de format afin de transformer notre nouveau format en jetons reconnus par Moment.

Par exemple, ajoutons un nouveau format personnalisé appelé "LMD" . Nous devons d’abord le définir pour chaque langue que nous voulons utiliser:

moment.updateLocale('en', {
   longDateFormat: {
       LMD: 'MMMM D'
   }
});

moment.updateLocale('fr', {
    longDateFormat: {
        LMD: 'D MMMM'
    }
});

Ensuite, nous remplaçons la fonction de format d'origine et transformons la inputString ("LMD") en jetons réels que nous avons définis précédemment . Après cela, nous appelons simplement la fonction d'origine et laissez Moment faire son travail normalement

var originalMomentFormat = moment.prototype.format;
moment.prototype.format = function (inputString) {
    if (inputString === 'LMD') { // check for your custom types here. maybe use constants or whatever
        inputString = moment.localeData().longDateFormat(inputString);
    }
    return originalMomentFormat.apply(this, [inputString]);
};

Exemple d'utilisation:

moment(someDate).format('LMD');
0
Emilie