JavaScript Intl/BCP 47: Как использовать формат даты ISO «гггг-мм-дд» для немецких языков вместо «дд.мм.гггг»?

В Германии используются два разных формата даты:

  • современный (используется не очень часто, ISO-8601): 2022-01-31
  • классический (используется большинством немцев): 31.01.2022

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) ... поэтому я надеялся, что что-то подобное также будет возможно с «дд.мм.гггг» против «гггг-мм-дд».

Почему Date.prototype.toISOString не вариант?

Konrad 18.11.2022 13:22

@Konrad Linkowski Это используется внутри библиотеки JavaScript, где все форматирование даты выполняется с использованием Intl.DateTimeFormat, а форматы даты настраиваются только с помощью locale и Intl.DateTimeFormatOptions.

Natasha 18.11.2022 13:29

Что бы это ни стоило, вся цель таких инструментов, как Intl и ICU, состоит в том, чтобы избежать необходимости возиться с чрезвычайно сложными данными локали, которые никто не может освоить. Хотелось бы, чтобы соответствующая документация была более доступной.

Álvaro González 18.11.2022 17:34
[JS за 1 час] - 9. Асинхронный
[JS за 1 час] - 9. Асинхронный
JavaScript является однопоточным, то есть он может обрабатывать только одну задачу за раз. Для обработки длительных задач, таких как сетевые запросы,...
Подъем в javascript
Подъем в javascript
Hoisting - это поведение в JavaScript, при котором переменные и объявления функций автоматически "перемещаются" в верхнюю часть соответствующих...
Как использовать API парсинга квитанций с помощью JavaScript за 5 минут?
Как использовать API парсинга квитанций с помощью JavaScript за 5 минут?
В этом руководстве вы узнаете, как использовать API парсинга квитанций за 5 минут с помощью JavaScript. Eden AI предоставляет простой и удобный для...
Хук useOnClickOutside в ReactJS
Хук useOnClickOutside в ReactJS
Как разработчик ReactJS, вы, возможно, сталкивались с ситуацией, когда вам нужно закрыть модальное или выпадающее меню, когда кто-то щелкает за его...
Хуки (часть-2) - useEffect
Хуки (часть-2) - useEffect
Хук useEffect - один из самых мощных и универсальных инструментов в арсенале разработчика React. Он позволяет вам управлять побочными эффектами в...
Простое руководство по тестированию взаимодействия с пользователем с помощью библиотеки тестирования React
Простое руководство по тестированию взаимодействия с пользователем с помощью библиотеки тестирования React
В предыдущем посте я показал вам на примерах, как писать базовые тесты в React. Важнейшей частью пользовательского интерфейса приложений является...
1
3
97
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используйте 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]);

Спасибо за Ваш ответ. Но просто использовать другой язык/страну нельзя, так как это будет иметь негативный побочный эффект на форматирование чисел, переводы и т. д. Вот почему я написал «[...] просто расширив локаль в приведенном выше примере (' де-ДЕ...')". Я добавлю это как ограничение к моему вопросу, чтобы сделать это более ясным.

Natasha 18.11.2022 13:43

Другие вопросы по теме