java - 日期的 DateFormat 解析行为从 Java 8 更改为 Java 9,是否有任何相关的环境设置?

标签 java date parsing unparseable

这个问题在这里已经有了答案:





JDK dateformatter parsing DayOfWeek in German locale, java8 vs java9

(2 个回答)



SimpleDateFormat toPattern behaves differently in java 9

(1 个回答)


2年前关闭。




我有一个在 Java 5 中编译并运行 Java 代码的遗留 Web 应用程序,当尝试构建一个新环境以在 Java 12 中运行相同的代码时,我遇到了日期格式问题。我已经在 J​​ava 5、7、8、9、10、11、12 中对此进行了测试,并且在使用 Java 9 或更高版本时代码行为发生了变化。

我没有更改 Web 应用程序的 Java 源代码的选项。

问题与使用 java.text.DateFormat 和 parse(String) 方法有关。

这个小测试应用程序显示了问题:

import java.util.*;
import java.text.*;

public class LocaleAndDateTester {

    public LocaleAndDateTester() {
    }

    public static final void main(String[] argv) {
        LocaleAndDateTester a = new LocaleAndDateTester();
        a.go();
    }

    private void go() {
        System.out.println("Locale country: " + Locale.getDefault().getDisplayCountry());

        java.text.DateFormat df = java.text.DateFormat.getDateInstance();
        String[] dateToTest = {"01-JAN-2020", "12-SEP-2019", "12/SEP/2019", "12/09/2019",
                               "September 12, 2019", "Sep 12, 2019", "12 Sep 2019",
                               "12 September 2019"};
        System.out.println("\nTesting dates:");
        for (int i = 0; i < dateToTest.length; i++) {
            try {
                Date date = df.parse(dateToTest[i]);
                System.out.println(dateToTest[i] + " -> " + date);
            } catch (ParseException e) {
                System.out.println(e.toString());
            }
        }
    }
}


我在 Java 5 中编译了代码,并在不同版本上运行了相同的类。

在 Java 5 到 8 中运行它,输出如下:
Locale country: United Kingdom

Testing dates:
01-JAN-2020 -> Wed Jan 01 00:00:00 GMT 2020
12-SEP-2019 -> Thu Sep 12 00:00:00 BST 2019
java.text.ParseException: Unparseable date: "12/SEP/2019"
java.text.ParseException: Unparseable date: "12/09/2019"
java.text.ParseException: Unparseable date: "September 12, 2019"
java.text.ParseException: Unparseable date: "Sep 12, 2019"
java.text.ParseException: Unparseable date: "12 Sep 2019"
java.text.ParseException: Unparseable date: "12 September 2019"

在 Java 9 或更高版本中运行,输出是这样的:
Locale country: United Kingdom

Testing dates:
java.text.ParseException: Unparseable date: "01-JAN-2020"
java.text.ParseException: Unparseable date: "12-SEP-2019"
java.text.ParseException: Unparseable date: "12/SEP/2019"
java.text.ParseException: Unparseable date: "12/09/2019"
java.text.ParseException: Unparseable date: "September 12, 2019"
java.text.ParseException: Unparseable date: "Sep 12, 2019"
12 Sep 2019 -> Thu Sep 12 00:00:00 GMT 2019
12 September 2019 -> Thu Sep 12 00:00:00 GMT 2019

DateFormat 解析方法的默认行为的这种更改会导致我的 Web 应用程序出现错误。

有没有人看到这一点,并想出如何通过不同的 Java 版本使默认值保持一致?

我想知道这是否与传递到 Java System Properties 的 OS 环境变量有关。我最接近导致更改的方法是更改​​“user.country”Java 属性。但是我找不到可以提供从 DD-MMM-YYYY 格式解析的日期的设置。

请记住 - 我无法更改 Java 源代码 - 我只能修改操作系统环境属性和 Java 系统属性。

解决方案

通过下面的答案提供,其中给出了相关文章。

我已经在 J​​ava 11 和 12 上对此进行了测试,并且可以正常工作。将以下命令行选项添加到 java 命令:
-Djava.locale.providers=COMPAT,CLDR

使用该命令行选项在 Java 11 或 12 中运行测试应用程序将提供与使用 Java 8 或更低版本运行相同的输出,而不使用命令行选项。

最佳答案

是的,Java 9 发生了变化。这就是为什么你应该在升级任何软件之前研究发行说明的一个例子。

在 Java 9 及更高版本中,OpenJDK 默认使用不同的本地化数据源:Unicode Consortium 提供的 CLDR。见 JEP 252 .

CLDR 是此信息的更丰富的来源。但是正如您所看到的,本地化是一个复杂的问题,涉及不断发展的人类语言和文化规范,因此对正确性的看法可能存在差异,并且随着时间的推移可能会发生变化。

您的问题中的解决方法是正确的:使用 Java 早期版本中的旧默认值覆盖本地化数据的新默认源。

关于java - 日期的 DateFormat 解析行为从 Java 8 更改为 Java 9,是否有任何相关的环境设置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58010818/

相关文章:

java - 来自 Kotlin 包的 RuntimeException 的用例

c# - 如何在 C# 中从 excel 将日期转换为 dd.MM.yyyy 格式

ios - if语句ios检查json参数

python - 获取每个项目的 python dict.keys 轨迹

java - 来自 Tomcat 的不完整 HTTP 响应

java - 单行文本 block

MySQL 错误 1148 & 1290 : Custom Date type format dd-mm-yyyy by importing csv file in MySql Workbench 8

algorithm - 解析具有未定义数量的参数的表达式

java - Android:加载、操作和使用图像

java - Java中的日期处理