В последнее время у нас возникла странная ошибка в рабочей среде (тестовые среды отлично работают).
java.lang.IllegalArgumentException: символ нелегального шаблона 'y'
Это вызвано следующим кодом
SimpleDateFormat dateFormat = (SimpleDateFormat)DateFormat.getDateInstance();
dateFormat.applyLocalizedPattern("yyyy-MM-dd");
Эта ошибка обычно возникает, если, например, использовать "Y" вместо "y" в течение года. Это не так, как вы можете видеть выше. Я не уверен на 100% от локали, установленной на сервере. Linux env LANG установлен на "de_DE.UTF_8", поэтому это, вероятно, используется.
Ввод исходного кода SimpleDateFormat.java Я нашел метод translatePattern(String pattern, String from, String to)
. Это исключает упомянутое исключение, если какой-либо символ из pattern
не существует. Значения выглядят как это при отладке локально на другом компьютере
pattern = "yyyy-MM-dd"
from = "GyMdkHmsSEDFwWahKzZ"
Из исключения на сервере видно, что первый "y" не существует в from
. from
извлекается из formatData.getLocalPatternChars()
, который является DateFormatSymbols
, инициализированным из локали на сервере.
Доступны ли даже локали, которые могут иметь форматы без 'y'? Эта ошибка началась без какого-либо изменения кода, и, насколько мне известно, изменение конфигурации сервера не было.