如何修改DateFormatSymbols月份值

时间:2011-10-12 16:36:29

标签: java

我正在尝试为特定区域设置添加特定月份名称。 我遇到的问题是挪威语bokmal(nb)的语言环境SimpleDateFormat返回的月份名称是英语而不是norweigan。但是,似乎locale(no)工作正常

e.g。此代码会在1月,2月等结果。

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()));
}

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()));
}

我知道我可以使用特定的DateFormatSymbols配置SimpleDateFormat但是这无助于保持我的代码对于任何未来的本地人都是通用的。我想知道是否有人知道如何修改受支持的java语言环境的默认月份值?我想我会添加一个资源文件,但无法弄清楚如何。

2 个答案:

答案 0 :(得分:3)

查看SimpleDateFormatsource code中使用的构造函数:

public SimpleDateFormat(String pattern, Locale locale) {
    super();
    calendar = new GregorianCalendar(locale);
    ...
    formatData = new DateFormatSymbols(locale);
    ...
    numberFormat = NumberFormat.getInstance(locale);
    ...
}

正在使用的语言环境的第一个和最后一个实例(GregorianCalendar和(NumberFormat)看起来没有希望,但是中间的(DateFormatSymbols)则很有用。查看其source code,我们在构造函数的第一行中看到一个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");
}

这是您必须编辑的资源包。有很多工具可以做到这一点:

一旦编辑并保存了ResourceBundle,则必须扩展这两个类-扩展的DateFormatSymbols将需要使用新的ResourceBundle,而扩展的SimpleDateFormat将需要使用该新的扩展类。

如果您需要更多资源,请考虑查看this oracle article

答案 1 :(得分:2)

较新的Java版本确实支持nb(挪威语)语言环境:

    Locale bokmaal = Locale.forLanguageTag("nb");
    for (Month m : Month.values()) {
        System.out.println(m.getDisplayName(TextStyle.FULL, bokmaal));
    }

我的Java 9.0.4上的输出:

januar
februar
mars
april
mai
juni
juli
august
september
oktober
november
desember

在Java 1.8.0_101上,我得到相同的输出。

这是2018年,所以我当然使用的是现代Java日期和时间API(不再是设计欠佳的DateFormatSimpleDateFormatCalendar)java.time。

对于到此为止想要提供其他语言环境名称(或对从nb语言环境获得的输出不满意)的人,有两种选择:

  • 您可以提供自己的CalendarNameProvider实现。
  • 您可以使用DateTimeFormatterBuilder及其appendText方法的重载版本,该方法接受用于格式和解析的名称映射。

this questions: SimpleDateFormat with German Locale - Java 8 vs Java 10中还有更多内容。

链接