javascript — как получить формат даты из строковой даты

#javascript #angular #date #format

Вопрос:

Как я могу получить формат даты (например: DD/MM/YYYY ) из уже отформатированной даты (например: 1/9/2021 ). Также я могу как-то добиться того, чтобы не менять дату США и НЕ дату США ( DD/MM/YYYY против MM/DD/YYYY ).

Я использую угловой проект (на случай, если есть угловое решение)

Комментарии:

1. Вы не можете, поэтому new Date('31/08/2021') в большинстве (всех?) реализаций будет возвращена недопустимая дата. Единственный надежный способ проанализировать временные метки-это если вы заранее знаете формат.

Ответ №1:

Вы можете использовать moment.js чтобы разобрать дату, например:

 import moment from "moment";

const newDate = moment("1/9/2021", "MM/DD/YYYY").format("DD/MM/YYYY");
// newDate = 09/01/2021
 

Комментарии:

1. Мне нужно получить формат из уже отформатированного datestring. У меня нет проблем с форматированием даты. У меня есть datestring, который выглядит так, 1/9/2021 и мне нужно получить тип используемого форматирования, чтобы результат был таким DD/MM/YYYY .

2. Откуда берется эта отформатированная дата ?

3. Мне нужно получить формат в зависимости от локальных настроек пользователя (если его система использует DD/MM/YYYY или MM/DD/YYYY ). Когда я узнаю, что его система использует DD/MM/YYYY , я форматирую указанную дату в том формате, который я получил.

Ответ №2:

Короткий ответ: вы не можете надежно определить формат, который пользователь вводит строку даты на основе настройки системы, даже если у вас был доступ к ним, потому что пользователь может ввести значение в другом формате. Например. в Британии распространены день/месяц/год, но если вы посмотрите на дату на этот раз газеты вы увидите что-то вроде «в воскресенье, 5 сентября 2021».

Это одна из причин, по которой используются средства выбора дат, однако многие пользователи по-прежнему предпочитают вводить даты вручную и часто находят средства выбора дат раздражающими.

В любом случае, мне показалось немного забавным определить локализованный формат, который используется.DateTimeFormat создает для системного языка по умолчанию. Это, конечно, совершенно ненадежно, что бы там ни было. 🙂

Это работает, потому что formatToParts возвращает части массива в порядке, связанном с языком, вместе с разделителями.

 function getDateFormat(lang) {
  let d = new Date(2021,0,20);      
  let format = new Intl.DateTimeFormat(lang,{
    year: 'numeric',
    month: 'numeric',
    day: 'numeric'
  }).formatToParts(d).reduce((acc,part) => {
    acc  = part.type == 'literal'? part.value : part.type;
    return acc;
  }, '');
  
  return format;
}

['default',
 'en-GB',
 'en-US',
 'en-CA',
 'nl-BX',
 'ar'].forEach(lang => {
   let langDefault = lang == 'default'? new Intl.DateTimeFormat('default').resolvedOptions().locale : null;
   console.log('Lang '   lang   (langDefault? ' ('   langDefault   ')':'')  
     ' format '   getDateFormat(lang)   '.');
});