Как вы форматируете datetime в am / pm без точек при использовании date-fns версии 2.x? - PullRequest
2 голосов
/ 17 марта 2020

Версия 2.x пакета превосходной даты date-fns имеет только эти встроенные форматы am / pm.

date-fns am pm formats

Как можно отформатировать строчные буквы am / pm без точек?

1 Ответ

2 голосов
/ 18 марта 2020

Версия 2.xx (выпуск)

Быстрое решение

Использование aaaaa'm':

format(new Date(), "YYYY-MM-DD hh:mm aaaaa'm'")

Объяснение: @GollyJer обнаружил действительно умный способ обойти это ограничение. Мы можем использовать aaaaa для получения a (для AM) или p (для PM) в соответствии с документацией . Затем мы просто следуем за ним с экранированным символом m, который равен 'm', что приводит к am или pm.

Примечание: это может привести к неправильному выводу, если вы разрешите любой вид переключения локали, поскольку AM и PM могут различаться в зависимости от языка.

Другие способы

Тем не менее, для этих версий нет native¹ способа сделать это, согласно документации и проверке исходного кода, потому что форматирование зависит от конфигурации локали, как показано в исходном коде ( _lib/format/formatters/index.js):

// AM or PM
a: function(date, token, localize) {
  var hours = date.getUTCHours()
  var dayPeriodEnumValue = hours / 12 >= 1 ? 'pm' : 'am'

  switch (token) {
    case 'a':
    case 'aa':
    case 'aaa':
      return localize.dayPeriod(dayPeriodEnumValue, {
        width: 'abbreviated',
        context: 'formatting'
  })
  // ...

1: по нативному, я имею в виду простой нативный API-форматер.

Вы можете добавить новую локаль , чтобы настроить строки. Это подразумевало бы изменение этой специфицированной c части (на основе locale/en-US/_lib/localize/index.js):

var formattingDayPeriodValues = {
    // ...
    abbreviated: {
        am: 'AM',
        pm: 'PM',
        // ...
    }
    // ...
}

Печально, что в этой новой версии нет простого способа настройки локалей по умолчанию или даже просто простой способ применить обезьяну-патч. Создание новой локали совсем не изящно, и замена a.m. на am вручную после вызова format тоже не подходит.

Версии 1.xx и 2.0.0 (альфа / бета) )

Для этих версий просто используйте формат a. Пример:

console.log(dateFns.format(new Date(), 'YYYY-MM-DD hh:mm a'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/date-fns/1.30.1/date_fns.min.js"></script>
<!-- or: https://cdnjs.cloudflare.com/ajax/libs/date-fns/2.0.0-alpha0/date_fns.min.js -->

Вы можете проверить в исходном коде как это работает:

var meridiemLowercase = [
    'am',
    'pm'
];

var formatters = {
    // ...
    'a': function (date) {
        return date.getHours() / 12 >= 1 ? meridiemLowercase[1] : meridiemLowercase[0];
    },
    // ...
}
...