4

Java 12 で同じコードを実行する新しい環境を構築しようとすると、Java コードをコンパイルして Java 5 で実行する従来の Web アプリケーションがあり、日付の書式設定の問題に遭遇しました。Java 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バージョンで一貫性を保つためにデフォルトを取得する方法を考え出しましたか?

OS環境変数がJavaシステムプロパティに渡されることに関係しているのではないかと思いました。変更を引き起こすことに最も近いのは、「user.country」Javaプロパティを変更することでした。しかし、DD-MMM-YYYY 形式から解析された日付を与える設定が見つかりませんでした。

覚えておいてください - 私は Java ソース コードを変更できません - OS 環境プロパティと Java システム プロパティしか変更できません。


解決

関連記事を提供する以下の回答を通じて提供されます。

Java 11 および 12 でこれをテストしましたが、動作します。次のコマンドライン オプションを java コマンドに追加します。

-Djava.locale.providers=COMPAT,CLDR

そのコマンドライン オプションを指定して Java 11 または 12 でテスト アプリケーションを実行すると、コマンドライン オプションを指定せずに Java 8 以下で実行した場合と同じ出力が得られます。

4

1 に答える 1