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

🤔 А знаете ли вы, что...
JavaScript имеет множество встроенных объектов, таких как Array, Date и Math.


1
97
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]);