我正在尝试为特定区域设置添加特定月份名称.我遇到的问题是挪威语bokmal(nb)的语言环境SimpleDateFormat返回的月份名称是英语而不是norweigan.但是,似乎locale(no)工作正常
例如,这段代码会产生一月,二月等.
String pattern = "MMMM";
DateFormat monthFormat = new SimpleDateFormat(pattern, new Locale("nb"));
Calendar cal = Calendar.getInstance();
for (int i = 0; i < 12; i++) {
cal.set(Calendar.MONTH, i);
System.out.println(monthFormat.format(cal.getTime()));
}
Run Code Online (Sandbox Code Playgroud)
vs此代码导致Januar,Februar等
String pattern = "MMMM";
DateFormat monthFormat = new SimpleDateFormat(pattern, new Locale("no"));
Calendar cal = Calendar.getInstance();
for (int i = 0; i < 12; i++) {
cal.set(Calendar.MONTH, i);
System.out.println(monthFormat.format(cal.getTime()));
}
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用特定的DateFormatSymbols配置SimpleDateFormat但是这无助于保持我的代码对于任何未来的本地人都是通用的.我想知道是否有人知道如何修改受支持的java语言环境的默认月份值?我想我会添加一个资源文件,但无法弄清楚如何.
查看源代码中使用的构造函数SimpleDateFormat:
public SimpleDateFormat(String pattern, Locale locale) {
super();
calendar = new GregorianCalendar(locale);
...
formatData = new DateFormatSymbols(locale);
...
numberFormat = NumberFormat.getInstance(locale);
...
}
Run Code Online (Sandbox Code Playgroud)
使用的语言环境的第一个和最后一个实例 ( GregorianCalendar) 和 ( NumberFormat) 看起来不太有希望,但中间的 ( DateFormatSymbols) 却很有希望。查看其源代码ResourceBundle,我们在构造函数的第一行看到:
public DateFormatSymbols (Locale locale) throws MissingResourceException {
ResourceBundle res = ResourceBundle.getBundle("gnu.java.locale.LocaleInformation",
locale, ClassLoader.getSystemClassLoader()); // This line!
ampms = getStringArray(res, "ampms");
eras = getStringArray(res, "eras");
localPatternChars = res.getString("localPatternChars");
months = getStringArray(res, "months");
shortMonths = getStringArray(res, "shortMonths");
shortWeekdays = getStringArray(res, "shortWeekdays");
weekdays = getStringArray(res, "weekdays");
runtimeZoneStrings = getZoneStrings(res, locale);
dateFormats = formatsForKey(res, "DateFormat");
timeFormats = formatsForKey(res, "TimeFormat");
}
Run Code Online (Sandbox Code Playgroud)
这是您必须编辑的资源包。有很多工具可以做到这一点:
编辑并保存 ResourceBundle 后,您必须扩展这两个类 - 您的扩展 DateFormatSymbols 将需要使用新的 ResourceBundle,而您的扩展 SimpleDateFormat 将需要使用该新的扩展类。
如果您需要更多资源,请考虑查看这篇 Oracle 文章。