Я пытаюсь отформатировать информацию о дате, времени, году и месяце Javascript примерно так:
//"Mon, Nov 5 08:46:20 PM"
Для этого я следую документации Mozilla здесь, как показано ниже:
var options = {
weekday: 'short',
month: 'short',
day: 'numeric',
hour: "2-digit",
minute: "2-digit",
second: "2-digit",
hour12: true
};
console.info(new Date().toLocaleDateString('en-US', options));
// always returns "Mon, Nov 5, 8:44:10 PM"Почему hour имеет однозначный формат, хотя я указал его как "двухзначный"? Как мне достичь формата, указанного в начале этого вопроса? Заранее благодарим за ответы!
@stealththeninja Я использую последнюю версию консоли браузера Chrome. Надеюсь это ответит на твой вопрос...
@Barmar вы проверили ссылку на спецификацию, включенную в вопрос? И momentjs, хотя и хорош в датах, особенно в часовых поясах и регионах, представляет собой большую библиотеку.
Мне кажется, это ошибка Chrome.
Если вы установите "hour12: false", похоже, работает, похоже на ошибку.
См. bugs.chromium.org/p/chromium/issues/detail?id=527926. Это для DateTimeFormat.format(), но я полагаю, что toLocaleDateString() использует тот же код и помечен как WONTFIX. Они утверждают, что это соответствует спецификации.
Вместо этого похоже на проблему со спецификацией, поэтому нет другого пути, кроме как создать свою собственную функцию, чтобы иметь 2-значное время с 12-часовым временем.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете использовать RegExp и String.prototype.replace()
, чтобы исправить эту проблему:
const options = {
weekday: 'short',
month: 'short',
day: 'numeric',
hour: "2-digit",
minute: "2-digit",
second: "2-digit",
hour12: true
};
// Tue, Nov 6, 04:04:55 AM:
console.info(new Date(1541473495383).toLocaleDateString('en-US', options).replace(/, (\d):/, ', 0$1:'));
// Tue, Nov 6, 10:04:55 AM:
console.info(new Date(1541495095383).toLocaleDateString('en-US', options).replace(/, (\d):/, ', 0$1:'));
// Now:
console.info(new Date().toLocaleDateString('en-US', options).replace(/, (\d):/, ', 0$1:'));Что делает .replace(/, (\d):/, ', 0$1:'):
Сопоставьте часть часа (которая идет после запятой, пробела и перед двоеточием) только в том случае, если она состоит из одной цифры (\d); в противном случае он не будет совпадать и ничего не заменит.
Захватывает эту цифру.
Замените все совпадение точно таким же, но добавив дополнительный 0 перед цифрой часа, к которому мы можем получить доступ в строке замены как $1.
Не уверен, что это актуально, но какую среду вы используете для тестирования? (Какой браузер или это NodeJs?)