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