Moment: получить локализованный формат только с месяцем и днями

Созданный на 1 авг. 2016  ·  20Комментарии  ·  Источник: moment/moment

Я просмотрел исходные файлы локали и не смог найти формат для отображения только месяца и дня без информации о году. Один пример из файла locale / zh-cn.js

longDateFormat : {
    LT : 'Ah点mm分',
    LTS : 'Ah点m分s秒',
    L : 'YYYY-MM-DD',
    LL : 'YYYY年MMMD日',
    LLL : 'YYYY年MMMD日Ah点mm分',
    LLLL : 'YYYY年MMMD日ddddAh点mm分',
    l : 'YYYY-MM-DD',
    ll : 'YYYY年MMMD日',
    lll : 'YYYY年MMMD日Ah点mm分',
    llll : 'YYYY年MMMD日ddddAh点mm分'
},

Все форматы списков имеют год. Можете ли вы поддерживать какой-либо формат, например LM или lm: 'MMMD 日'?

Пожалуйста, порекомендуйте.

Enhancement

Самый полезный комментарий

Мы используем это регулярное выражение, чтобы решить эту проблему.

moment().format('L').replace(new RegExp('[^\.]?' + moment().format('YYYY') + '.?'), '')

Он делает следующие преобразования
05.04.2017 -> 05.04 (например, us, gb)
2017-04-03 -> 04-03 (например, swe)
8.7.2017 -> 8.7. (например, плавник)

Все 20 Комментарий

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

Вероятно, проще использовать собственный формат, чем пытаться вписать его в форматы локали.

Мне тоже нужен такой формат.
Я не хочу делать его индивидуальным, так как он должен исправляться во всех разных регионах :)

То же самое.

Чтобы принять во внимание это, Intl.DateTimeFormat говорит, что реализация должна поддерживать как минимум следующие подмножества: (...) месяц, день (...). Возможно, это не актуально, но кажется важным учитывать это для сообщений, специфичных для локали.

Я только что просмотрел все языковые файлы, и для большинства языков это кажется довольно простым ...
@ mj1856 есть идеи, как я могу начать с этого?

@kaljak добавить формат легко, но где вы

Также отсюда: https://github.com/andyearnshaw/Intl.js/blob/master/locale-data/json/ или с https://github.com/unicode-cldr/cldr-dates-full/ ( которые также включают короткие / узкие версии для относительного времени, что было бы отличным дополнением :)).

Не связаны, но, возможно, в какой-то момент может иметь смысл вывести форматы, специфичные для локали, из Intl.DateTimeFormat и избежать включения данных локали, специфичных для данного момента?

Мне это тоже понадобится.

Мы используем это регулярное выражение, чтобы решить эту проблему.

moment().format('L').replace(new RegExp('[^\.]?' + moment().format('YYYY') + '.?'), '')

Он делает следующие преобразования
05.04.2017 -> 05.04 (например, us, gb)
2017-04-03 -> 04-03 (например, swe)
8.7.2017 -> 8.7. (например, плавник)

+1 по этому поводу.

Наш сайт показывает что-то подобное в локализованном формате:
Jan 5

Нет хорошего способа показать эту строку на таком языке, как испанский, который должен выглядеть так:
5 de Jan без обрезки текста года, который кажется недостижимым из-за языковых различий.

Т.е. moment().locale('es')format('ll') // 5 de Jan de 2018

@stenvala Замечательное решение!

При использовании с .format('ll') я получаю суффикс , , как я могу исправить это, чтобы удалить его?

Например: Jan 29, 2018 -> Jan 29,

Я столкнулся с той же потребностью, и вместо поддерживаемого способа я поместил следующий код во вспомогательный класс, который я использую внутри своих служб и завернутый в канал Angular для использования в шаблонах. Ваш пробег может быть очень большим, но я просмотрел все файлы локалей и думаю, что получил все различные варианты использования формата «ll» в качестве основы для нового формата «Месяц и день». Я тестировал следующие языки: en, es, hy-am, hu, cv, ja, lv. У каждого из них были интересные перестановки, включая буквы юникода в названиях месяцев.

if (format.indexOf("YYYY") === 0) {
        // In some locales, the Year is presented first, along with various punctuation (period, comma) as well as sometimes
        // hard coded words in brackets. The RegEx below strips everything off that shouldn't be there related to the YYYY prefix.
        return format.replace(/YYYY(\.)?(\s)?(\[([^\x00-\x7F]|\w)+\])?(\s)?/gi, '');
    }

    // In other locales, the year is presented at the end (or almost end). It can have various punctuation around it as well
    // as hard coded words in brackets. The RegEx below strips everything off that shouldn't be there related to the YYYY suffix.
    return format.replace(/(\s)?,?(\[([^\x00-\x7F]|\w)+\])?(\s)?YYYY.*/gi, '');

Удачи!

PS - Я не гуру RegEx и старался изо всех сил с приведенными выше выражениями. Кажется, они работают, но, вероятно, их можно оптимизировать.

Я сделал .format('MMMDo') чтобы в итоге получить то, что я хочу, не общий, но хорошо работает в моем случае.

👍

как насчет использования источника данных, который имеет правило форматирования для многих языков. Остальные языки получают текст-заполнитель p.ex. «Привет, разработчик. пожалуйста, сообщите о форматировании вашего языка проекту moment.js. Спасибо'

Таким образом, если какому-либо разработчику нужна короткая строка даты и он использует ее, он получит этот призыв к действию, и разрыв будет закрыт по требованию.

Вот еще один обходной путь с использованием Intl . Настройте объект options чтобы получить нужный формат. Intl.DateTimeFormat будет обрабатывать все локализованное упорядочение строк и локальных разделителей.

const localizedDateMonthNoYear = (moment) => {
    if (window && window.Intl && window.Intl.DateTimeFormat) {
      let options = {
        weekday: 'short',
        month: 'short',
        day: '2-digit',
      }
      return new Intl.DateTimeFormat('default', options).format(moment.toDate())
    }
    return moment.format('ll');
}

За 3 года не было никаких изменений в том, что является критическим вопросом, который мешает тому, чтобы moment.js считался завершенным в качестве библиотеки форматирования даты / времени ... слава богу, Intl API, который постепенно становится стандартом.

Некоторые из основных разработчиков Moment.js сейчас работают над предложениями TC39, потому что вы правы, почему бы не включить некоторые из этих функций в основной язык?

Вы можете использовать метод toLocaleDateString для JS Date. Например

const getFormattedDateTime = dateTime => dateTime.toLocaleDateString('ru-RU', {
  month: 'short',
  day: 'numeric',
  hour: 'numeric',
  minute: 'numeric',
})

См. Https://momentjs.com/docs/#/ -project-status /

Мы не будем добавлять новые токены.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги