В Германии используются два разных формата даты:
Intl
API JavaScript использует «классический» формат даты для локали de-DE
:
// This prints out: 31.01.2022
console.info(new Intl.DateTimeFormat('de-DE', {
year: 'numeric',
month: '2-digit',
day: '2-digit'
}).format(new Date(2022, 0, 31)));
Пожалуйста, найдите демо здесь: » Демо
Можно ли как-то использовать «современный» (= ISO-8601) формат даты с Intl, просто расширив языковой стандарт в приведенном выше примере («de-DE...»)? Например, использование локали de-DE-u-ca-iso8601
не работает.
Кстати: использование Date.prototype.toISOString
НЕ вариант.
[Изменить] Это также НЕ вариант просто использовать локаль для другой страны.
[Edit] Я надеялся найти ответ где-то здесь или здесь, но не нашел там решения.
[Изменить] Вы можете настроить формат времени по строке локали:en-GB
(показывает 24-часовой формат времени)en-GB-u-hc-h12
(показывает 12-часовой формат времени, добавляя am/pm)
... поэтому я надеялся, что что-то подобное также будет возможно с «дд.мм.гггг» против «гггг-мм-дд».
@Konrad Linkowski Это используется внутри библиотеки JavaScript, где все форматирование даты выполняется с использованием Intl.DateTimeFormat
, а форматы даты настраиваются только с помощью locale
и Intl.DateTimeFormatOptions
.
Что бы это ни стоило, вся цель таких инструментов, как Intl и ICU, состоит в том, чтобы избежать необходимости возиться с чрезвычайно сложными данными локали, которые никто не может освоить. Хотелось бы, чтобы соответствующая документация была более доступной.
Используйте en-CA
в качестве локали.
Afaik нет конкретной локали для форматирования в «современную» (iso) строку даты.
Либо разделите и измените порядок строки даты, либо используйте formatToParts
вместо format
, либо разделите результат Date.toISOString
, это могут быть другие идеи.
// 1. locale 'en-CA' (not an option as per comment)
console.info(new Intl.DateTimeFormat(`en-CA`, {
year: `numeric`, month: `2-digit`, day: `2-digit`})
.format(new Date(2022, 0, 31)));
// 2. split and reorder the result
console.info(new Intl.DateTimeFormat(`de-DE`, {
year: `numeric`, month: `2-digit`, day: `2-digit`})
.format(new Date(2022, 0, 31))
.split(`.`)
.reverse()
.join(`-`) );
// 3. use formatToParts
const reformatGerman = new Intl.DateTimeFormat(`de-DE`, {
year: 'numeric', month: '2-digit', day: '2-digit'})
.formatToParts(new Date(2022, 0, 31))
.filter( v => ~[`year`, `month`, `day`].indexOf(v.type) )
.reduce( (acc, val) => ({...acc, [val.type]: val.value}), {} );
console.info(`${
reformatGerman.year}-${
reformatGerman.month}-${
reformatGerman.day}`);
// 4. truncate the result of `toISOString()`
console.info(new Date(Date.UTC(2022, 0, 31))
.toISOString().split(`T`)[0]);
Спасибо за Ваш ответ. Но просто использовать другой язык/страну нельзя, так как это будет иметь негативный побочный эффект на форматирование чисел, переводы и т. д. Вот почему я написал «[...] просто расширив локаль в приведенном выше примере (' де-ДЕ...')". Я добавлю это как ограничение к моему вопросу, чтобы сделать это более ясным.
Почему
Date.prototype.toISOString
не вариант?