java dateformat非法模式字符'y'

Ras*_*nke 13 java locale simpledateformat

我们最近开始在生产环境上遇到一个奇怪的错误(测试环境工作正常).

java.lang.IllegalArgumentException:非法模式字符'y'

这是由以下代码引起的

SimpleDateFormat dateFormat = (SimpleDateFormat)DateFormat.getDateInstance();
dateFormat.applyLocalizedPattern("yyyy-MM-dd");
Run Code Online (Sandbox Code Playgroud)

例如,当使用'Y'而不是'y'表示年份时,通常会抛出此错误.如上所示,这不是这种情况.我不是100%确定服务器上设置的语言环境.Linux env LANG设置为"de_DE.UTF_8",因此可能会使用它.

输入SimpleDateFormat.java的源代码我找到了方法translatePattern(String pattern, String from, String to).这会抛出当patternfrom中不存在任何字符时提到的异常.在其他计算机上本地调试时,值看起来像这样

pattern ="yyyy-MM-dd"
from ="GyMdkHmsSEDFwWahKzZ"

从服务器上的例外来看,很明显第一个'y'不存在from.from从中获取formatData.getLocalPatternChars(),这是DateFormatSymbols从服务器上的语言环境初始化的.

是否有可用的格式没有'y'?这个错误已经开始发生而没有任何代码更改,据我所知,没有更改服务器配置.

obo*_*ain 11

从SimpleDateFormat javadoc:

SimpleDateFormat还支持本地化的日期和时间模式字符串.在这些字符串中,上述模式字母可以用其他依赖于语言环境的模式字母替换.

在您的情况下,本地是DE,因此本地化模式将是jjjj-MM-tt.J代表Jahr,代表TTage.

如果您不想处理本地化模式,只需使用SimpleDateFormat.applyPattern("yyyy-MM-dd").


har*_*rsh 8

理想情况下,您应该强制执行模式的区域设置,否则您的模式需要针对不同的区域设置进行更改,因为yyyy适用于en_US,jjjj适用于de_DE等.而是仅将yyyy和locale指定为en_US,而不管机器的区域设置如何.

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH);
System.out.println(format.format(new java.util.Date()));
Run Code Online (Sandbox Code Playgroud)

正如javadoc所说:

使用给定模式和给定语言环境的默认日期格式符号构造SimpleDateFormat.注意:此构造函数可能不支持所有语言环境.要获得完整的覆盖率,请使用DateFormat类中的工厂方法.

参数:

pattern:描述日期和时间格式的模式

locale:应使用其日期格式符号的语言环境

这样您就不必担心为运行时区域设置选择哪个本地字符串并强制执行一次特定区域设置.