Подтвердить что ты не робот

Java.lang.IllegalArgumentException: Недопустимый символ шаблона 'Y' для SimpleDateFormat

Следующий код:

Calendar now = Calendar.getInstance();
month = now.get(Calendar.MONTH) + 1;
year = now.get(Calendar.YEAR);
System.out.println("Month " + month + " year " + year);
SimpleDateFormat dt1 = new SimpleDateFormat("MMMM YYYY");
e.setMonthnYear(dt1.format(now.getTime()));

После развертывания на сервере отображается следующее исключение:

java.lang.IllegalArgumentException: Illegal pattern character 'Y'
    java.text.SimpleDateFormat.compile(SimpleDateFormat.java:768)
    java.text.SimpleDateFormat.initialize(SimpleDateFormat.java:575)
    java.text.SimpleDateFormat.<init>(SimpleDateFormat.java:500)
    java.text.SimpleDateFormat.<init>(SimpleDateFormat.java:475)
    iland.employee.EmployeeAction.fetchAllAtted(EmployeeAction.java:169)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    java.lang.reflect.Method.invoke(Method.java:597)

На моем локальном хосте я использую JDK v1.8, и приведенный выше код работает отлично, но на сервере он не работает.

Как я могу это решить?

4b9b3361

Ответ 1

попробуйте

SimpleDateFormat dt1 = new SimpleDateFormat("MMMM yyyy");

Ответ 2

На вашем локальном компьютере вы можете использовать Java 8, поэтому проверьте версию Java на своем сервере. Если он меньше Java 7, капитал Y не будет работать.

Обратитесь к Java 6 Документация Oracle для SimpleDateFormat

Вы должны написать Y за год в маленьком не в столицах.

Как и для двухзначного года:

 SimpleDateFormat dt1 = new SimpleDateFormat("yy");

И для четырехзначного года:

 SimpleDateFormat dt1 = new SimpleDateFormat("yyyy");

Если вы используете Java 7 или выше: Вы можете использовать капитал Y, который представляет Week Year.

Обратитесь к Java 7 Oracle Docs SimpleDateFormat

Ответ 3

В соответствии с javadocs

If week year 'Y' is specified and the calendar doesn't support any week years,
the calendar year ('y') is used instead. The support of week years can be tested
with a call to getCalendar().isWeekDateSupported().

Таким образом, единственная проблема заключается в том, что ваша версия java < 1.7, потому что JRE1.7 добавил шаблон "Y" для Недельного года, а в JRE1.6 для этого нет шаблона.

Или просто оставайтесь на более безопасной стороне y вместо y.

Еще одна вещь всегда пытается использовать локаль на более безопасной стороне

SimpleDateFormat dt1 = new SimpleDateFormat("MMMM yyyy",java.util.Locale.ENGLISH);

Ответ 4

Документация отличается от реализации. Поддерживаемые символы определяются в строковой константе в SimpleDateFormat до уровня API 23. Из исходного кода:

static final String PATTERN_CHARS = "GyMdkHmsSEDFwWahKzZLc";

Так как "Y" (Week Year) не включен, проверка шаблона генерирует исключение:

java.lang.IllegalArgumentException: Unknown pattern character 'Y'

Быстрое исправление, когда поведение в течение недели не требуется, заключается в использовании "y", например: yyyy-MM-dd.

"Y" в качестве символа шаблона поддерживается с уровня API 24.

Ответ 5

От java.text.SimpleDateFormat:

Letter  Date or Time Component  Presentation    Examples 
y       Year                    Year            1996; 96
Y       Week year               Year            2009; 09

Вы запрашиваете Week year вместо year при вызове SimpleDateFormat()

Ответ 6

Я взял эту таблицу из java docs.

Letter  Date or Time Component  Presentation    Examples
G   Era designator  Text    AD
y   Year    Year    1996; 96
M   Month in year   Month   July; Jul; 07
w   Week in year    Number  27
W   Week in month   Number  2
D   Day in year Number  189
d   Day in month    Number  10
F   Day of week in month    Number  2
E   Day in week Text    Tuesday; Tue

В вашем случае просто замените "Y" на "y"  вы можете увидеть Документы здесь