dayjs неправильно анализирует даты на британском английском

#locale #dayjs

#locale #dayjs

Вопрос:

Я экспериментирую dayjs . Следуя примеру в документации, я установил это в своем HTML-скрипте:

 <script src="https://unpkg.com/dayjs@1.10.4/dayjs.min.js"></script>
<script src="https://unpkg.com/dayjs@1.10.4/locale/en-gb.js"></script>
 

В моем JS-коде у меня есть строки:

 var locale = dayjs.locale('en-gb');
var date = dayjs('1/4/21').format('DD MMM YYYY');
 

Первая строка правильно возвращает locale значение ‘en-gb’. Однако вторая строка возвращается date как «04 января 2021 года», когда она должна быть «01 апреля 2021 года», в соответствии со стандартным британским английским порядком дат DMY.

Я проверил, что в файле локали en-gb указана правильная дата.

Как мне исправить эту проблему?

Редактировать

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

Ответ №1:

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

 const customParseFormat = require("dayjs/plugin/customParseFormat");
dayjs.extend(customParseFormat);
dayjs("01/04/2021", "DD/MM/YYYY").format("DD MMM YYYY")
 

Ответ №2:

Как упоминалось в OP, эта функциональность не поддерживается dayjs or momentjs на момент написания этого вопроса.

Вот решение проблемы ES6:

 // Create this utility function
function formatLocale(dateStr: string) {
  const values = dateStr.split('/');

  // Make sure string is valid
  const isValid = values.length === 3 amp;amp; values.every(val => val.length > 0);
  if (!isValid) return dateStr; // don't change if date isn't valid (handle error however you want)

  if (dayjs.locale() === 'en-gb')
    return `${values[1]}/${values[0]}/${values[2]}`;
  // otherwise
  return dateStr;
}

// Usage
dayjs(formatLocale('1/4/2022')).format('DD MMM YYYY') // "01 April 2022"
 

Создайте служебную функцию formatLocale , которую можно использовать для проверки текущей локали dayjs , если это "en-gb" так, она будет соответствующим образом манипулировать строковым вводом, чтобы соответствовать ожидаемому dayjs . Если локаль — это что-то другое или если ввод строки недопустим, он не будет манипулировать входной строкой.