Определите строку даты локали правильно - PullRequest
0 голосов
/ 27 мая 2019

У меня есть строка даты, которая отформатирована в зависимости от языка / локали браузера.Например, "03/05/2019" в en-US - это 5 марта 2019 года (мм / дд / гггг), но в en-NZ это 3 мая 2019 года (дд / мм / гггг).

Мне нужнознать, как преобразовать строку в дату, используя JavaScript с соответствующей локалью.Я не могу жестко закодировать формат, потому что локаль действительно зависит от браузера.Я пытался использовать Moment.js, но я не могу заставить его работать.Возвращает invalid date для таких дат, как "16/05/2019".Похоже, что он не соответствует локали, которую я установил en-NZ.

Вот код моментов, которые я пробовал:

moment().locale('en-NZ').format('L')

Это вернет формат en-NZтекущая дата - 27/05/2019, но когда я пытаюсь включить строку с датой:

moment('16/05/2019').locale('en-NZ').format('L')

Это возвращает «Недопустимая дата».Любые предложения о том, как это сделать или даже другой плагин, который я могу использовать?Спасибо.

Ответы [ 4 ]

0 голосов
/ 27 мая 2019

Спасибо за ваши предложения, но я думаю, что нашел решение и ответил на свой вопрос.Я неправильно использовал моменты.Дата, длинный формат даты и локаль - все это параметры функции момента.Поэтому она правильно определила дату, и теперь я могу отформатировать ее в любом формате.(при условии, что у вас есть код для получения языкового стандарта браузера, например, предложенный @Dean Meehan)

new Date(moment('16/05/2019','L','en-nz').format('MM/DD/YYYY'))

Итак, 16/05/2019 на en-NZ читается как 16 мая 2019 года.

0 голосов
/ 27 мая 2019

Хотя это и не идеально, есть несколько способов идентифицировать строку даты.

В вашем случае я бы попытался использовать языковой API, доступный в новых браузерах.

if(navigator.language=="en-US"){
    //USA Date Format
}else{
   //NZ Date Format
}

Вы можете расширить его, используя полный список стран: https://en.wikipedia.org/wiki/Date_format_by_country

См. Get Locale Short Date Format с использованием javascript для получения полного списка языков и форматов, которые можно использовать.

Я бы также посоветовал использовать Luxon поверх Moment.JS, так как он более перспективен и поддерживает локали.

0 голосов
/ 27 мая 2019

К сожалению, языковой стандарт текущего пользователя не очень хорошо доступен в API, доступном для JavaScript. Этот ответ входит в некоторые из них, но даже здесь, в 2019 году, Chrome не поддерживает ни одно из перечисленных здесь свойств, кроме navigator.language, что не является надежным (мое возвращается как en-US, но я нахожусь в Великобритании, поэтому должно быть en-GB [все в моей системе форматирует мои даты в британском формате]).

Единственный способ найти местный формат даты - этокак Intl.DateTimeFormat, чтобы отформатировать дату и затем обработать ее из результата:

const format = new Intl.DateTimeFormat()
  .format(new Date(2019, 11, 25)) // Christmas 2019
  .replace("2019", "YYYY")
  .replace("12", "MM")
  .replace("25", "DD");
console.log(format);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>

В моей системе это возвращает DD/MM/YYYY, потому что я нахожусь в Великобритании, которая, как и NZ, использует рациональный формат.(Я частично американец, так что я могу шутить американцам по поводу их странного формата даты.) Предположительно в США он вернет MM/DD/YYYY.

Затем вы можете использовать этот формат с moment:

const format = new Intl.DateTimeFormat()
    .format(new Date(2019, 11, 25)) // Christmas 2019
    .replace("2019", "YYYY")
    .replace("12", "MM")
    .replace("25", "DD");

document.getElementById("btn").addEventListener("click", function() {
    const str = document.getElementById("date").value.trim();
    const dt = moment.utc(str, format);
    console.log(`The date in ISO format: ${dt.toISOString()}`);
});
Enter a date in your local format and click Parse It:
<input type="text" id="date" autofocus>
<input type="button" id="btn" value="Parse It">

<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>

Возможно, вы захотите предложить своим пользователям поле для выбора их локали, в этом случае вы захотите moment-with-locales.min.js вместо moment.min.js выше.

0 голосов
/ 27 мая 2019

За http://momentjs.com/docs/#/parsing/string-format/ необходимо передать формат:

Если вы знаете формат входной строки, вы можете использовать его для анализа момент.

moment("12-25-1995", "MM-DD-YYYY");

Парсер игнорирует не буквенно-цифровые символы, поэтому оба следующий вернет то же самое.

moment("12-25-1995", "MM-DD-YYYY");
moment("12/25/1995", "MM-DD-YYYY");

Токены синтаксического анализа аналогичны токенам форматирования, используемым в момент # формат.

...