java dateformat非法模式字符';y';

java dateformat非法模式字符';y';,java,locale,simpledateformat,Java,Locale,Simpledateformat,我们最近开始在生产环境中出现一个奇怪的错误(测试环境工作正常) java.lang.IllegalArgumentException:非法模式字符“y” 这是由以下代码引起的 SimpleDateFormat dateFormat = (SimpleDateFormat)DateFormat.getDateInstance(); dateFormat.applyLocalizedPattern("yyyy-MM-dd"); 例如,当使用“Y”而不是“Y”表示年份时,通常会引发此错误。正如你在上

我们最近开始在生产环境中出现一个奇怪的错误(测试环境工作正常)

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

这是由以下代码引起的

SimpleDateFormat dateFormat = (SimpleDateFormat)DateFormat.getDateInstance();
dateFormat.applyLocalizedPattern("yyyy-MM-dd");
例如,当使用“Y”而不是“Y”表示年份时,通常会引发此错误。正如你在上面看到的,这里的情况并非如此。我不能100%确定服务器上设置的区域设置。LinuxEnvLang设置为“de_de.UTF_8”,因此可能会使用此选项

在输入simpleDataFormat.java的源代码时,我找到了方法
translatePattern(字符串模式、字符串从、字符串到)
。当
模式
中的任何字符在from中不存在时,这会引发所述的异常。在其他计算机上进行本地调试时,这些值如下所示

pattern=“yyyy-MM-dd”
from=“gymdkhmssedfwwwahkzz”

从服务器上的异常可以看出,第一个“y”显然不存在于
From
中<来自的代码>从
formatData.getLocalPatternChars()
获取,这是从服务器上的区域设置初始化的
DateFormatSymbols


有没有甚至可以使用不带“y”的格式的区域设置?此错误在没有任何代码更改的情况下开始出现,据我所知,服务器配置没有更改。

来自SimpleDataFormat javadoc:

SimpleDataFormat还支持本地化的日期和时间模式 串。在这些字符串中,可以使用上面描述的模式字母 替换为其他依赖于区域设置的模式字母

在您的例子中,本地模式是DE,因此本地化模式将是
jjjmmtt
J
代表Jahr,
T
代表Tage


如果您不想处理本地化模式,只需使用。

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

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH);
System.out.println(format.format(new java.util.Date()));
正如javadoc所说:

使用给定的模式和默认值构造SimpleDataFormat 指定区域设置的日期格式符号。注:此构造函数可能 不支持所有区域设置。要实现完全覆盖,请使用中的factory方法 DateFormat类

参数:

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

区域设置:应使用其日期格式符号的区域设置


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

您运行的确切JVM是什么?java.vm.specification.vendor:Sun Microsystems Inc.java.runtime.version:1.6.0_37-b06,它与在测试中运行的JVM相同?是的。我解决了这个问题,它是一个初始化问题,通常设置一个没有被正确调用的特定区域。您的瑞典德语区域设置是不常见的,您可以考虑在该问题中包含这样的信息。在这样的服务器上安装美国英语版本的操作系统以避免不常见的配置并不少见。谢谢,我想我刚刚发现了错误。。。我们将服务器语言环境设置为德语,但在initservlet中将其改写为瑞典语。我认为当昨天重新开始生产时,初始化可能已经崩溃了,而我们被困在了德国地区!是的,我同意,我提到的代码是2007年的,不是我写的。我们确实在服务器上强制使用区域设置,但由于集成失败,导致在调用区域设置之前初始化崩溃。setDefault(新区域设置(“sv”,“SE”))被调用,导致使用德语的服务器默认值:)如果要维护上述代码,您可能希望使初始化错误致命,因此应用程序拒绝运行。