JavaScript вопрос Intl.DateTimeFormat странно выводит секунды

104
03 октября 2021, 05:30
  new Intl.DateTimeFormat('en', {
    second: '2-digit'
  })

ожидалось, что секунды будут выводиться в формате 01 02 03, но вместо этого выводятся 1 2 3, при чем когда я вывожу не только секунды, а и минуты

  new Intl.DateTimeFormat('en', {
    minute: '2-digit',
    second: '2-digit'
  })

то результат как и ожидалось будет 00:00, при чем есть еще одна особенность, если значение ключа указать 'numeric' то результат будет такой же

  new Intl.DateTimeFormat('en', {
    minute: 'numeric',
    second: 'numeric'
  })

выведет 00:00, хотя ожидается 0:0 - это нормальная работа этого конструктора и на что вообще должны влиять 'numeric' и '2-digit'?

и всё-таки есть способ вывести одни секунды в формате 00 с помощью Intl?

Answer 1

Тут, насколько я смог разобраться в стандарте, вырисовывается следующая картина. Стандарт говорит, что элементы внутреннего свойства [[localeData]], соответствующие поддерживаемым локалям, должны содержать свойство formats, в котором перечислены все поддерживаемые комбинации опций, с соответствующими значениями этих опций. Конструктор при вызове ищет в этом списке комбинацию, наиболее близко соответствующую переданным опциям, и применяет именно найденные свойства.

Судя по всему в [[localeData]]['en'] хранится что-то таком духе: [..., {seconds : 'decimal'}, ...], и нет ничего более близкого к передаваемому {seconds : '2-digit'}. Что-то аналогичное происходит и во втором случае, когда передается {minute: 'numeric', second: 'numeric'}. Находится только {minute: '2-digit', second: '2-digit'}, и в итоге применяются именно эти опции.

Результат можно наблюдать при помощи метода resolvedOptions():

console.log(new Intl.DateTimeFormat('en', { 
  second: '2-digit'     
}).resolvedOptions()); 
console.log(new Intl.DateTimeFormat('en', { 
  minute: 'numeric',    
  second: 'numeric'     
}).resolvedOptions());

Мораль такова: использовать произвольные сочетания опций форматирования нельзя, а можно только определенные их комбинации. К сожалению, не знаю, где посмотреть доступные варианты, и есть ли среди локалей такая, в которой предусмотрено использование {second : '2-digit'}.

READ ALSO
Как сделать замену в захваченном регуляркой тексте?

Как сделать замену в захваченном регуляркой тексте?

Как можно произвести замены только по захваченному регуляркой тексту? Есть файл, где нужно поменять содержимое определённых теговПример:

159
Как вывести в переменную JS ответ от Yandex Translation API?

Как вывести в переменную JS ответ от Yandex Translation API?

Всем приветЕсть необходимость переводить отдельные строки с одного языка на другой

162
Github как правильно устанавливать и пользоваться пакетами

Github как правильно устанавливать и пользоваться пакетами

Здраствуйте, подскажите, как правильно пользоваться GitHub? Через npm умею устанавливать пакеты, а как их правильно подключить к проекту не могу...

221
Подключение Vue Js пакетов к проекту

Подключение Vue Js пакетов к проекту

Здраствуйте, не получается подключить пакеты к проекту, в моем случае палитру к backend админкиВ админке использую Yii и Php Пробовал по инструкции...

172