最近我们在生产环境中遇到了奇怪的错误(测试环境正常运行)。
java.lang.IllegalArgumentException: 非法的模式字符'y'
这是由以下代码引起的。
SimpleDateFormat dateFormat = (SimpleDateFormat)DateFormat.getDateInstance();
dateFormat.applyLocalizedPattern("yyyy-MM-dd");
通常,当年份使用'Y'而非'y'时,会抛出此错误。但是,正如您在上面看到的那样,这不是本案例的情况。我不能确定服务器上设置的语言环境是否正确。Linux环境的LANG设置为“de_DE.UTF_8”,因此可能被使用。
进入SimpleDateFormat.java源代码,我找到了方法translatePattern(String pattern, String from, String to)
。当pattern
中的任何字符不存在于from中时,就会抛出上述异常。本地在另一台计算机上进行调试时,值看起来像这样:
pattern =“yyyy-MM-dd”
from =“GyMdkHmsSEDFwWahKzZ”
从服务器上的异常中可以看出,第一个“y”不存在于from
中。from
是从formatData.getLocalPatternChars()
获取的,该方法是由从服务器获取的区域设置初始化的DateFormatSymbols
。
有没有可用的区域设置可以没有“y”的格式?这个错误已经开始出现,没有任何代码更改,并且根据我的知识,服务器配置也没有更改。