java - 如何使 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 时间 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);
}
}
推荐阅读
- r - 在R中绘制多个带有长文本标题的图表?
- javascript - 将映射逻辑从适配器存储到数据库
- java - 如何在每行中创建具有不同颜色的微调器
- swift - Swift UITableView / UICollectionVIew 将数据传递到 cellForRowAt 中的单元格返回 nil
- ruby - 编写我的块时遇到问题,语法错误?
- python - AttributeError:模块“seaborn”没有属性“热图”
- python - 如何将误差线添加到分组条形图中?
- import - 导入的 Python 文件在正文或任何主函数中没有任何代码运行。我该如何操作这个文件?
- azure-data-factory - 从 ADF 触发 Azure ML 工作区中的 Jupyter Notebook
- python - Google Foobar - 请通过编码消息测试用例失败