首页 > 解决方案 > 如何使 DateTimeFormatter 以法语输出 3 个字符月

问题描述

我正在致力于将现有系统国际化以支持法语。我希望使用 3 个字符的缩写来显示月份,以与英文版本保持一致。不幸的是,令人惊讶的是,MMM 输出了 3 和 4 个字符串的混合,用句号小写。

Locale.setDefault(Locale.FRENCH);
for (Month month : Month.values()) {
    LocalDateTime date = LocalDateTime.of(2020, month, 1, 23, 59);
    System.out.println(DateTimeFormatter.ofPattern("dd MMM uu").format(date));
}

输出

01 janv. 20
01 févr. 20
01 mars 20
01 avr. 20
01 mai 20
01 juin 20
01 juil. 20
01 août 20
01 sept. 20
01 oct. 20
01 nov. 20
01 déc. 20

在查看 Javadoc 后,似乎 MMM 以英文输出 3 个字符的月份字符串是巧合而不是设计。TextStyle.SHORT状态

短文本,通常是缩写。例如,星期几的星期一可能会输出“Mon”。

我更喜欢在 Java 中使用现有的 i18n 工具,而不必通过属性文件等引入我自己的字符串。

我管理过的最好的代码是以下有点hacky的代码。当然必须有更简单的方法吗?是否有任何 API 可以以编程方式重新定义月份,以便“MMM”按我想要的“开箱即用”工作?

for (Month month : Month.values()) {
    LocalDateTime date = LocalDateTime.of(2020, month, 1, 23, 59);

    String original = DateTimeFormatter.ofPattern("dd 'MMM' uu").format(date);
    String monthStr = DateTimeFormatter.ofPattern("MMM").format(date);
    if (monthStr.length() > 3) {
        monthStr = monthStr.substring(0, 3);
    }
    monthStr = monthStr.substring(0, 1).toUpperCase() + monthStr.substring(1);
    System.out.println(original.replace("MMM", monthStr));
}

输出

01 Jan 20
01 Fév 20
01 Mar 20
01 Avr 20
01 Mai 20
01 Jui 20
01 Jui 20
01 Aoû 20
01 Sep 20
01 Oct 20
01 Nov 20
01 Déc 20

标签: java

解决方案


Java 时间 API 中使用的字符串是不可配置的。

我能想到的最好的办法是避开 MMM,然后用英语的“开箱即用”值或法语的自定义值替换它。

public static void main(String[] args) {
    Locale.setDefault(Locale.FRANCE);
    for (Month month : Month.values()) {
        LocalDateTime date = LocalDateTime.of(2020, month, 1, 23, 59);
        String original = DateTimeFormatter.ofPattern("dd 'MMM' uu").format(date);
        System.out.println(original.replace("MMM", getMonth(date.getMonth())));
    }
}

private static String getMonth(Month month) {
    if (Locale.FRENCH.getLanguage().equals(Locale.getDefault().getLanguage())) {
        return new String[] { "Jan", "Fév", "Mar", "Avr", "Mai", "Jun", "Jul", "Aoû", "Sep", "Oct", "Nov",
                "Déc" }[month.ordinal()];
    } else {
        return DateTimeFormatter.ofPattern("MMM").format(month);
    }
}

推荐阅读