私は、コードのこの小さな作品を持っています:
import java.text.SimpleDateFormat;
import java.util.Date;
public class Main {
public static void main(String[] args) {
SimpleDateFormat format = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz");
System.out.println(format.format(new Date()));
}
}
Javaの8を使用すると、出力は次のようになります。
Tue, 16 Jul 2019 13:16:54 AEST
Javaの11の場合:
Tue., 16 Jul. 2019 13:16:54 AEST
なぜ違いがあり、どのように私はそれが両方のJavaバージョンで均等に動作させるために自分のコードを変更する必要がありますか?
私が実際に使用したハンドルバーを)...同じフォーマット文字列に同じ結果を生成するためにハンドルを使用する方法を知っているが、それはクールになる-この問題を見つけながら、私はJavaのバージョンにダウン、それを絞り込むことができ
TL; DR
システムプロパティと(Javaの11を含む)は、後にJava 9を実行し、java.locale.providers
次のように定義されました:
java -Djava.locale.providers=COMPAT,CLDR YourApp
今、出力は、Java 8のように、例えば同じ形式で、ドットなしです。
火曜、2019年7月16日夜02時24分15秒AEST
CLDR
Javaは、4つのソースまでの週の日と異なる言語でヶ月間使用される略語を含めて、そのロケールデータを取得します。Javaの8 Javaの独自のロケールデータまではデフォルトでした。JavaからUnicodeの共通ロケールデータリポジトリから8つのロケールデータ(CLDRは、下部にあるリンクを参照)あまりにも含まれており、Javaの9から、彼らはデフォルトです。Javaの独自のデータはまだ含まれており、指定してアクセスされているCOMPAT
上記のシステムプロパティで。私たちは、ソースが順番に試されるなどの文字列で最初にそれを配置する必要があります。
一つは、別の(そしておそらくよりよい)ソリューションは、すべてのJavaのバージョンでCLDRを使用するだろうと期待しているかもしれません。不思議なことに、これはこの場合、すべてのJavaのバージョンで私たちと同じ形式を与えるものではありません。ここにプロパティを設定する出力があるCLDR,JRE
(JREは、COMPATの古い名前であるJavaの8の上に私たちが代わりにこれを使用する必要があります)。
Javaの8の場合:
火曜、2019年7月16日夜02時35分02秒AEST
Javaの9および11の場合:
火、2019年7月16日夜02時35分52秒AEST
CLDRはバージョンで来て、同じバージョンが異なるJavaのバージョンに含まれていません。
java.time
ここで私は上記の出力のために使用されているスニペットです。
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
"EEE, dd MMM yyyy HH:mm:ss zzz", Locale.forLanguageTag("en-AU"));
ZonedDateTime now = ZonedDateTime.now(ZoneId.of("Australia/Sydney"));
System.out.println(now.format(formatter));
私は、現代のJavaの日付と時刻APIを使用してjava.timeを推薦しています。日時あなたが使用していること、クラス、SimpleDateFormat
およびは、Date
私はそれらを避けることをお勧めしますので、長く時代遅れされており、常に悪い設計されていました。Javaの8日以降、我々はそれらを使用する必要がありますない理由は確かにありません、とjava.timeはあまりにもJavaの6と7にバックポートされました。
リンク
- CLDR - Unicodeの共通ロケールデータリポジトリ
- ウィキペディアの記事:共通ロケールデータリポジトリ
- デフォルトで使用CLDRロケール・データ Javaプラットフォームでは、Standard EditionのOracleのJDK 9移行ガイド
LocaleServiceProvider
ドキュメント CLDR、COMPATとより:可能なロケール・データ・ソースを綴ります。- Oracleのチュートリアル:日付時刻 java.timeを使用する方法を説明します。