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
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
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

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