Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用DateTimeFormatter获取本地特定日期_Java_Date Format - Fatal编程技术网

Java 使用DateTimeFormatter获取本地特定日期

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

我一直在尝试将一些日期转换为特定于语言环境的格式。 比如说我有日期: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-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);
}
以不同的方式修补jako


检查预期的单元测试套件可能很有用,因为特定于区域设置的数据可能会随着时间的推移而变化。

您是否尝试过
FormatStyle.LONG
?它应该介于
中等
完全
之间。如果结果不令人满意,您可能需要为不同的地区选择不同的格式样式。我建议您不要使用
DateFormat
。那门课是出了名的麻烦和过时。您的方法2要好得多。尝试使用FormatStyle.LONG和DateTimeFormatter,得到了与方法1相同的结果。如何为不同的区域设置选择不同的格式样式?无法在命令行中添加任何其他选项,因为此应用程序将在不同的系统中运行。