2014-12-08 4 views
23

Я использую Moment.js в моем проекте и форматирование даты следующим образом:Locale и конкретный формат даты с 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' 

ответ

17

Хорошо. Это немного ужасно, но вы знали, что это будет.

Во-первых, вы можете получить доступ к фактической строки формата для (например) '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 ...

+0

Я согласен с вами, похоже, что это единственный способ в настоящее время. Надеюсь, в будущем они добавят больше форматов. – Jekyll

+5

Это не сработает в нескольких культурах. Возьмем португальский язык как пример: Полная дата будет: «14 de Fevereiro de 2016».Если вы просто удалите год, в этом случае «2016», вы получите: «14 de Fevereiro de», это неправильно. Правильный результат должен быть «14 de Fevereiro». По крайней мере, у испанцев есть одна и та же проблема (так что с этими двумя мы уже говорим о более чем 650 миллионах возможных пользователей, затронутых этой ошибкой). Я вижу, что другие языки будут иметь такую ​​же проблему. – RGPT

+1

RGPT - хороший момент, отредактировал сообщение, чтобы добавить это к оговоркам. В общем, этот подход подходит только тогда, когда вы изменяете короткий, числовой формат даты с предсказуемым разделителем. –

1

Насколько я понимаю, вы можете изменить формат даты (без года) для определенных языков, используя MomentJS свойства https://momentjs.com/docs/#/customization/long-date-formats/

Пример:

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 
    } 
}); 
Смежные вопросы