Подтвердить что ты не робот

Язык и формат даты с помощью 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'
4b9b3361

Ответ 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');