Javaの8以下でそう:
DateTimeFormatter df = DateTimeFormatter.ofPattern("E d MMM yyyy");
この方法で適用する場合:
LocalDate date = LocalDate.now();
date.format(df);
このような何かを生成します:
"Available on Thu 30 Aug 2018"
しかし、Javaの10で実行まったく同じコードは、次を生成します。
"Available on Thu. 30 Aug. 2018"
日と月のセクションの後の期間に注意してください...
私はよく承知している私は単なる文字列にピリオドを置き換えることができますが、私は実際にそれを行うにはしたくありません。この変更が発生した理由を私は思ったんだけどと場合、代替パターンがありますか?
私は、オンラインでこの変更への参照を見つけることができません。
EDIT:
以下バジルの答えあたりとして、Javaバージョンの問題ではありません。これは、ロケールの問題です。私のコードとのドッキングウィンドウの画像は、アウスの1日に米国のロケールと私のマシン上で実行されている:)
確認 Locale
句読点および関連事項(略称、綴り、要素の順序が)文化的規範の一部として定義されます。Javaでは、これらの文化的規範はで指定されていますLocale
。
ロケールは、実行時に変化させます
一つの可能性のある問題は、指定せずに、コードを実行していることであるLocale
あなたは、JVMの現在のデフォルトロケールに暗黙的に依存していることを意味する、明示的に。そのデフォルトは、ランタイム環境の間で異なる場合があります。
確認するために、あなたのデフォルトのロケールをログに記録します。
Locale.getDefault().toString()
あなたの指定する方法を確認するには、以下のコード例を検討Locale
明示。私はお勧めします常にあなたのすることLocale
(ちなみに、タイムゾーンの同上)明示的に。
定義、実行時に変化させます
大きな変更点は、Java 9と日時ローカライズに関して起こっていること注:JEP 252:使用CLDRロケール・データデフォルトで。少なくとも、OpenJDKのベースのJVMのために、これらの文化的規範に関する情報のソースはに切り替え共通ロケールデータリポジトリによって提供さユニコードコンソーシアム。
特定のケースのために使用した場合、ここで説明Locale.US
しますが、次のコード例に見ることができるよう、私たちは、何の違いは見られません。しかし、いくつかのロケールのために、あなたは確かにJavaの8以降のJava 9と対以前との違いを見ることができます。
異なるロケールがあなたの質問の第二の例では関与していたのであれば、再び、私は疑問に思います。この修正は、明示的にあなたやあなたのユーザーを期待、というよりは、JVMの現在の瞬間的なデフォルト(初期設定はいつでも変更することができますに暗黙的に依存するロケールを指定することであろう時にランタイム!)。
問題を確認することはできません
System.out.println( System.getProperty( "java.version" ) );
System.out.println( Locale.getDefault().toString() );
LocalDate ld = LocalDate.of( 2018 , Month.AUGUST , 30 );
Locale locale = Locale.US;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "E d MMM yyyy" , locale );
String output = ld.format( f );
System.out.println( output );
OpenJDKのベースを経由してのJava 10.0.2で実行するとズールーJVMによってアズールシステムズ MacOSのハイシエラ下MacBook Proの網膜上のIntelliJ 2018.3で、私が取得します:
10.0.2
en_US
木2018年8月30日
Javaの8のために、この同じ参照IdeOne.comでライブ実行コードを。、JVMは、単一のロケールに固定されてIdeOne.comで使用されることに注意してくださいLocale.US
。
en_US
1.8.0_112
出力:木2018年8月30日
オーストラリア
ここにあなたの出力はオーストラリアなど他の英語圏のロケールで標準である方法の例です。
LocalDate ld = LocalDate.of( 2018 , Month.AUGUST , 30 );
Locale locale = new Locale( "en" , "AU" ); // "en-AU" is English Australia.
DateTimeFormatter f = DateTimeFormatter.ofPattern( "E d MMM yyyy" , locale );
String output = ld.format( f );
木 8月30日 2018