Java 使用DateTimeFormatter获取本地特定日期
我一直在尝试将一些日期转换为特定于语言环境的格式。 比如说我有日期:2019年1月17日 我想为以下地区翻译此日期:Java 使用DateTimeFormatter获取本地特定日期,java,date-format,Java,Date Format,我一直在尝试将一些日期转换为特定于语言环境的格式。 比如说我有日期:2019年1月17日 我想为以下地区翻译此日期: localized time for en-GB: 17 January 2019 localized time for es-ES: 17 de enero de 2019 localized time for zh-CN: 2019年1月17日 localized time for de-DE: 17. Januar 2019 localized time for fr
localized time for en-GB: 17 January 2019
localized time for es-ES: 17 de enero de 2019
localized time for zh-CN: 2019年1月17日
localized time for de-DE: 17. Januar 2019
localized time for fr-FR: 17 janvier 2019
localized time for it-IT: 17 gennaio 2019
localized time for ja-JP: 2019年1月17日
localized time for ko-KR: 2019년 1월 17일
我尝试了多种方法来实现这一点:
方法1:
final DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM,
Locale.forLanguageTag(locale)));
不同地区的输出:
localized time for en-GB: 17 January 2019
localized time for es-ES: 17 de enero de 2019
localized time for zh-CN: 2019年1月17日
localized time for de-DE: 17. Januar 2019
localized time for fr-FR: 17 janvier 2019
localized time for it-IT: 17 gennaio 2019
localized time for ja-JP: 2019/01/17 [Getting the date in numerical form]
localized time for ko-KR: 2019년 1월 17일 (목) [Getting this extra character at the end for ko-KR]
zoned fek long ja-JP: 2019年1月17日
zoned fek long ko-KR: 2019년 1월 17일 목요일
zoned fek long es-ES: jueves 17 de enero de 2019
zoned fek long fr-FR: jeudi 17 janvier 2019
zoned fek long it-IT: giovedì 17 gennaio 2019
zoned fek long de-DE: Donnerstag, 17. Januar 2019
zoned fek long ko-KR: jeudi 17 janvier 2019
方法2:
ZonedDateTime zoned = ZonedDateTime.now();
DateTimeFormatter pattern = DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL).withLocale(Locale.forLanguageTag(locale));
不同地区的输出:
localized time for en-GB: 17 January 2019
localized time for es-ES: 17 de enero de 2019
localized time for zh-CN: 2019年1月17日
localized time for de-DE: 17. Januar 2019
localized time for fr-FR: 17 janvier 2019
localized time for it-IT: 17 gennaio 2019
localized time for ja-JP: 2019/01/17 [Getting the date in numerical form]
localized time for ko-KR: 2019년 1월 17일 (목) [Getting this extra character at the end for ko-KR]
zoned fek long ja-JP: 2019年1月17日
zoned fek long ko-KR: 2019년 1월 17일 목요일
zoned fek long es-ES: jueves 17 de enero de 2019
zoned fek long fr-FR: jeudi 17 janvier 2019
zoned fek long it-IT: giovedì 17 gennaio 2019
zoned fek long de-DE: Donnerstag, 17. Januar 2019
zoned fek long ko-KR: jeudi 17 janvier 2019
在这种方法中,JP看起来不错,但所有其他地区的输出中也有一天
我必须显示上面提到的日期。Edit:CLDR
使用命令行选项-Djava.locale.providers=CLDR,COMPAT
运行方法2。例如:
java -Djava.locale.providers=CLDR,COMPAT YourApp
输出:
我发现在我的Java9上无法重现您的问题。使用FormatStyle.LONG
我得到了2019年1.月17日代码>适用于您报告的日语2019/01/17
。Java从不同的来源获取日期格式作为其区域设置数据的一部分。来自Java8的语言环境数据来自Java,但默认使用Java自己的语言环境数据。在Java9中,情况正好相反,CLDR数据被用作默认值。因此,我对上面的命令行选项所做的是,我告诉您的Java8在使用Java之前先使用CLDR。Java自己的语言环境数据被指定为COMPAT
当然,另一个选择是升级到Java9、10或11。这也会给你你想要的结果
不带命令行选项的Java8
无法在命令行中添加任何其他选项,因为
应用程序将通过不同的系统运行
那太不幸了。你可能想再问一次。另一方面,命令行选项可能会改变其他系统所有部分的行为,因此您可能无法通过这种方式
如果所有其他操作都失败,请为FormatStyle.LONG
无法提供所需内容的区域设置编写一些例外代码。显示了一种执行此操作的方法
一旦另一个系统的管理员决定升级到Java 9或更高版本,除非他们在CLDR
之前使用命令行选项使用COMAPT
,否则区域设置数据将发生变化,您将有机会简化代码。因为您不想以自定义格式列出所有区域设置,修补异常似乎更好。这可能是一个自定义模式,也可能只是选择另一种样式/后期编辑
String[] locales = {"en-GB", "es-ES", "zh-CN", "de-DE", "fr-FR", "it-IT",
"ja-JP", "ko-KR", "ko-KP"};
for (String loc : locales) {
String[] langCtry = loc.split("-");
Locale locale = new Locale(langCtry[0], langCtry[1]);
Locale.setDefault(locale);
LocalDate.set(2019, 1, 17);
FormatStyle style = locale.getLanguage().equals("ja") ? FormatStyle.FULL
: FormatStyle.LONG;
DateTimeFormatter.ofLocalizedDate(style);
String text = format.format(date);
if (locale.getLanguage().equals("ko")) {
text = text.replaceFirst("\\s\\S+$", "");
}
System.out.printf("%s: %s%n", locale, text);
}
这以不同的方式修补ja和ko
检查预期的单元测试套件可能很有用,因为特定于区域设置的数据可能会随着时间的推移而变化。您是否尝试过FormatStyle.LONG
?它应该介于中等
和完全
之间。如果结果不令人满意,您可能需要为不同的地区选择不同的格式样式。我建议您不要使用DateFormat
。那门课是出了名的麻烦和过时。您的方法2要好得多。尝试使用FormatStyle.LONG和DateTimeFormatter,得到了与方法1相同的结果。如何为不同的区域设置选择不同的格式样式?无法在命令行中添加任何其他选项,因为此应用程序将在不同的系统中运行。