【发布时间】:2016-06-20 11:25:43
【问题描述】:
我正在尝试理解一些 SimpleDateFormat 代码。特别是我试图在 SimpleDateFormat 中使用本地化模式字符串。来自javadoc:
SimpleDateFormat 还支持本地化的日期和时间模式字符串。在这些字符串中,上述模式字母可以替换为其他依赖于语言环境的模式字母。
它还指定了一个SimpleDateFormat(String pattern, DateFormatSymbols formatSymbols) 构造函数:
使用给定的模式和日期格式符号构造一个 SimpleDateFormat。
然而,尽管getLocalPatternChars() 实例呈现预期的模式字符,SimpleDateFormat 的构造函数拒绝包含这些字符的模式:
public void run() {
Locale loc = new Locale("de", "de");
DateFormatSymbols dfs = new DateFormatSymbols(loc);
String sym = dfs.getLocalPatternChars();
System.out.println(sym);
SimpleDateFormat datefmt = new SimpleDateFormat("tt.MM.uuuu", dfs);
}
产生输出:
GuMtkHmsSEDFwWahKzZ
Exception in thread "main" java.lang.IllegalArgumentException: Illegal pattern character 't'
at java.text.SimpleDateFormat.compile(SimpleDateFormat.java:845)
...
如果我将最后一行替换为“... new SimpleDateFormat("tt.MM.uuuu", loc);”,我会得到相同的输出。
另一方面,如果我使用任何 Anglicized 模式字符串创建 SimpleDateFormat 实例,然后调用“applyLocalizedPattern("tt.MM.uuuu")”,则接受本地化模式。
所以看起来不能在 SimpleDateFormat 的构造函数中使用本地化的模式字符串,并且需要这个两步初始化。这是故意行为吗?
【问题讨论】:
-
构造函数没有调用
translatePattern(applyLocalizedPattern这样做),所以这要么是一个错误,要么是一个错误的JavaDoc,它没有清楚地解释构造函数的用法。 -
@Tom 是对的。构造函数的模式参数仅引用未本地化的日期时间模式字符。
标签: java localization simpledateformat