java.lang.IllegalArgumentException:SimpleDateFormat的非法模式字符'Y'

时间:2014-08-16 05:31:35

标签: java

以下代码:

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并且上面的代码运行正常,但在服务器上它无效。

我该如何解决这个问题?

6 个答案:

答案 0 :(得分:44)

尝试

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

答案 1 :(得分:21)

在您的Local上,您可能正在使用Java 8,因此请检查服务器上的Java版本。如果它小于Java JDK 7,则大写Y将不起作用。

请参阅Java {6}文档SimpleDateFormat

您必须以小y编写年份而不是大写Y

喜欢2位数年份:

 SimpleDateFormat dt1 = new SimpleDateFormat("yy");

4位数年份:

 SimpleDateFormat dt1 = new SimpleDateFormat("yyyy");

如果您使用的是Java 7或更高版本: 您可以使用代表Y的大写Week Year

请参阅Java 7 Oracle Docs SimpleDateFormat

答案 2 :(得分:6)

根据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版本&lt; 1.7因为 JRE1.7添加了“Y&#39;周年和JRE1.6的模式没有模式。

或者只使用y而不是Y来保持更安全的一面。

还有一件事总是尝试使用区域设置在更安全的一面

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

答案 3 :(得分:4)

的Android

documentation与实施不同。受支持的字符在SimpleDateFormat中的字符串常量中定义,最高为API级别23.来自source code

static final String PATTERN_CHARS = "GyMdkHmsSEDFwWahKzZLc";

由于未包含'Y'(周年),模式验证会抛出异常:

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

快速修复,当不需要周年行为时,使用'y',例如:yyyy-MM-dd

从API级别24开始支持

'Y'作为模式字符。

更新

documentation现在列出了支持的模式字符API级别。

答案 4 :(得分:2)

我从java文档中获取此表。

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

在您的情况下,只需更换&#34; Y&#34;到&#34; y&#34;  你可以看到Docs here

答案 5 :(得分:0)

来自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()