Java 如何修改DateFormatSymbols月值

Java 如何修改DateFormatSymbols月值,java,Java,我正在尝试为特定地区添加特定的月份名称。 我遇到的问题是挪威bokmal(nb)的语言环境。SimpleDataFormat返回的月份名称是英文的,而不是norweigan。然而,似乎locale(no)工作正常 e、 g.该代码在1月、2月等产生 String pattern = "MMMM"; DateFormat monthFormat = new SimpleDateFormat(pattern, new Locale("nb")); Calendar cal = Calendar.ge

我正在尝试为特定地区添加特定的月份名称。 我遇到的问题是挪威bokmal(nb)的语言环境。SimpleDataFormat返回的月份名称是英文的,而不是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()));
}
String pattern=“MMMM”;
DateFormat monthFormat=新的SimpleDateFormat(模式,新语言环境(“nb”));
Calendar cal=Calendar.getInstance();
对于(int i=0;i<12;i++){
校准设置(日历月,i);
System.out.println(monthFormat.format(cal.getTime());
}
vs此代码将导致1月、2月等

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()));
}
String pattern=“MMMM”;
DateFormat monthFormat=新的SimpleDateFormat(模式,新语言环境(“否”));
Calendar cal=Calendar.getInstance();
对于(int i=0;i<12;i++){
校准设置(日历月,i);
System.out.println(monthFormat.format(cal.getTime());
}

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

查看for
SimpleDateFormat
中使用的构造函数:

public SimpleDateFormat(String pattern, Locale locale) {
    super();
    calendar = new GregorianCalendar(locale);
    ...
    formatData = new DateFormatSymbols(locale);
    ...
    numberFormat = NumberFormat.getInstance(locale);
    ...
}
第一个和最后一个使用的locale实例(
gregorianalendar
)和(
NumberFormat
)看起来不太有希望,但中间的一个(
DateFormatSymbols
)看起来很有希望。查看its,我们在构造函数的第一行中看到一个
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,而扩展的SimpleDataFormat将需要使用新的扩展类


如果您需要更多的资源,请考虑查看。

< P>更新的java版本支持<代码> NB<代码>(NordsBokkl)区域:

我的Java 9.0.4上的输出:

januar
februar
mars
april
mai
juni
juli
august
september
oktober
november
desember
在Java1.8.0_101上,我得到了相同的输出

现在是2018年,所以我当然在使用java.time,这是现代java日期和时间API(不再是设计拙劣的
DateFormat
SimpleDateFormat
Calendar

对于想要为不同语言环境提供名称(或对从
nb
locale获得的输出不满意)的人,有两个选项:

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

链接


我碰巧查看了详细信息,您似乎需要遵循iso标准。可能您有一个有效常数列表,具体取决于它。顺便说一句,“nb”不是一个有效的语言常量,这就是为什么它没有被识别并且英语被视为默认值的原因。我不太明白您想说什么,但您是在谈论i18n和
ResourceBundle
。如果是这样的话,这可能会有帮助:@Bhesh:OP想要为特定的月份定义自定义月份名称。Java不使用任何语言
nb
,因此它将默认使用英语月份名称。这与
ResourceBundle
API无关。到目前为止,这是一个相当老的问题-您是否找到了解决方案?它可能会变得有点复杂,但由于Java 8,您可能会看到a是否可以帮助您。
januar
februar
mars
april
mai
juni
juli
august
september
oktober
november
desember