Почему toLocaleTimeString(), всегда минута и секунда с нулевой отметкой

#javascript #time #locale #intl #time-format

Вопрос:

Я использую javascript Date.prototype.toLocaleTimeString() (или эквивалентно: Intl.Формат даты и времени())


Мне нужно представление времени (особенно минуты и секунды) БЕЗ ведущего нуля (когда мин/сек меньше 10).

Например, 13:2:3 или 1:2:3 PM (НЕ 13:02:03 или 1:02:03 PM )

Но я не могу этого достичь:

 const date = new Date('2/21/2021, 13:2:3')

const t1 = date.toLocaleTimeString('en-US') // 1:02:03 PM
const t2 = date.toLocaleTimeString('en-US', {timeStyle: 'medium'}) // 1:02:03 PM
const t3 = date.toLocaleTimeString('en-US', {timeStyle: 'short'}) // 1:02 PM
const t4 = date.toLocaleTimeString('en-US', {minute: '2-digit', second: '2-digit'}) // 02:03
const t5 = date.toLocaleTimeString('en-US', {minute: 'numeric', second: 'numeric'}) // 02:03


console.log(t1   'n'   t2   'n'   t3   'n'   t4   'n'   t5) 

По данным MDN:

минута

Представление минуты. Возможными значениями являются "numeric" , "2-digit" .

второй

Представление второго. Возможными значениями являются "numeric" , "2-digit" .


ПРИМЕЧАНИЕ: Для этого я не хочу использовать внешнюю библиотеку.

Комментарии:

1. Я думаю, что различие между numeric и 2-digit актуально только для лет, где 2-значный не учитывает столетие.

2. @Barmar, тогда почему они доступны для minute и second ?

3. Почему? Это заставляет его перестать выглядеть как время и приведет к путанице.

4. Понятия не имею, я думаю, что это просто согласованность для всех числовых полей.

Ответ №1:

Не знаю, зачем тебе это нужно, но эй.

Вы можете использовать formatToParts и удалять начальный ноль из любого типа, который вы хотите:

 const date = new Date('2/21/2021, 13:02:03')

const formatter = new Intl.DateTimeFormat(navigator.language, {
  hour: 'numeric',
  minute: 'numeric',
  second: 'numeric',
});

const dateString = formatter.formatToParts(date).map(({type, value}) => {
  switch (type) {
    case 'minute':
    case 'second':
        return value.replace(/^0/, '');
    default:
        return value;
  }
}).join('');


console.log(dateString)