Язык и формат даты с помощью Moment.js
Я использую Moment.js в моих проектах и датах форматирования следующим образом:
var locale = window.navigator.userLanguage || window.navigator.language;
moment.locale(locale);
someDate.format("L");
Это работает хорошо, но иногда мне нужно показывать дату без года. Я не могу использовать что-то вроде someDate.format("MM/DD")
, потому что на некоторых языках это должно быть someDate.format("DD/MM")
. Мне нужно что-то думать как L,LL,LLL
, но без года.
Что я могу сделать?
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'
Ответы
Ответ 1
Хорошо. Это немного ужасно, но вы знали, что это будет.
Сначала вы можете получить доступ к фактической строке формата (например) 'L'
:
var formatL = moment.localeData().longDateFormat('L');
Затем вы можете выполнить некоторую операцию на ней с помощью разумной замены регулярного выражения:
var formatYearlessL = formatL.replace(/Y/g,'').replace(/^\W|\W$|\W\W/,'');
(То есть: Удалите YYYY, плюс потерянный синтаксический разделитель, оставшийся после его удаления)
Затем вы можете использовать свою новую строку формата в момент вызова формата:
someDate.format(formatYearlessL);
Это обязательно делает некоторые предположения:
- Порядок числового формата месяца + день для локали соответствует порядку для формата года + месяц + день для этой локали с удаленным годом.
- В короткой форме используются разделители только между месяцем и днем (без ведущих/конечных разделителей).
- Разделитель для короткого числового формата даты всегда не является буквенно-цифровым.
- Формат состоит из числовых элементов и разделителей, а не формата формы предложения со статьями (см. комментарий RGPT ниже о испанском и португальском языках, который также будет применяться к длинным форматам на некоторых других языках).
При быстром просмотре locale/*.js
эти предположения верны для каждого файла локали, который я исследовал, но могут быть некоторые локали, которые их нарушают. (ETA: комментарий ниже указывает, что немецкий короткий формат даты нарушает второе предположение)
В качестве дополнительного важного оговорка это, вероятно, будет хрупким. Вполне возможно, что будущая версия moment.js изменит местоположение данных, находящихся в настоящее время в longDateFormat
...
Ответ 2
Насколько я понимаю, вы можете изменить формат даты (без года) для определенных языков, используя свойства MomentJS https://momentjs.com/docs/#/customization/long-date-formats/ p >
Пример:
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
}
});
Ответ 3
Библиотека не позволяет легко добавлять новые форматы, потому что они проверяются на регулярное выражение, которое мы не можем переопределить (var localFormattingTokens =/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g;
).
Однако мы можем переопределить функцию формата, чтобы преобразовать наш новый формат в токены, распознаваемые Moment.
Например, добавьте новый пользовательский формат под названием "LMD". Сначала нам нужно определить его для каждой локали, которую мы хотим использовать:
moment.updateLocale('en', {
longDateFormat: {
LMD: 'MMMM D'
}
});
moment.updateLocale('fr', {
longDateFormat: {
LMD: 'D MMMM'
}
});
Затем мы переопределяем функцию исходного формата и преобразуем inputString
("LMD") в реальные маркеры, которые мы ранее определяли. После этого мы просто вызываем оригинальную функцию и позволяем Moment выполнять свою работу как обычно:
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]);
};
Пример использования:
moment(someDate).format('LMD');