#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) '.');
});