2017-12-07 13 views
0

ZonedDateTime.now(ZoneOffset.of("+2:00")).minusDays(5)を使用して作成した日付があります。今私はyyyy-MM-ddとしてそれをフォーマットしたいと思います。DateTimeFormatter.ISO_LOCAL_DATEとJava 8+のDateTimeFormatter.ofPattern( "yyyy-MM-dd")

Java 8以降では、DateTimeFormatter.ISO_LOCAL_DATEDateTimeFormatter.ofPattern("yyyy-MM-dd")に相当しますか?

出力は同じように見えますが、ドキュメントのように同じである必要があります。しかし、その "ローカル"の部分は私に一時停止を与えた。通知私はオフセットがあり、私はZonedDateTimeを使用しています。私は、あなたがオフセットなどを扱っているので、これらの特別な状況を除いて、「彼らは同じことをしています」、または「彼らは同じだ」と思っていました。

+3

[ソース](http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8-b132/java/time/format/DateTimeFormatter.java)をチェックすることはできません。 #DateTimeFormatter.0ISO_LOCAL_DATE)または何らかのテストを行いますか? –

+1

最初のGoogleの結果:https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html#ISO_LOCAL_DATE –

+0

私はドキュメントを読んで両方をテストしました。出力は同じように見え、ドキュメントのように同じである必要があります。しかし、その "ローカル"の部分は私に一時停止を与えた。通知私はオフセットがあり、私はZonedDateTimeを使用しています。 –

答えて

3

5日前の日付時刻の書式設定では、2つの書式は同じになります。可能なすべての日付では同等ではなく、書式設定や解析には対応しません。

のは、それらを試してみましょう:

DateTimeFormatter yyyyMmDd = DateTimeFormatter.ofPattern("yyyy-MM-dd"); 
    int[] yearsToTest = { -900_000_000, -10_000, -2, 0, 1, 2017, 2099, 9999, 10_000, 900_000_000 }; 
    for (int year : yearsToTest) { 
     LocalDate date = LocalDate.of(year, Month.DECEMBER, 2); 
     String dateFormattedIso = date.format(DateTimeFormatter.ISO_LOCAL_DATE); 
     String dateFormattedYyyyMmDd = date.format(yyyyMmDd); 
     String diff = dateFormattedIso.equals(dateFormattedYyyyMmDd) ? "Same" : "Different"; 
     System.out.format("%-18s%-18s%s%n", dateFormattedIso, dateFormattedYyyyMmDd, diff); 
    } 

上記のスニペットプリント:

-900000000-12-02 +900000001-12-02 Different 
-10000-12-02  +10001-12-02  Different 
-0002-12-02  0003-12-02  Different 
0000-12-02  0001-12-02  Different 
0001-12-02  0001-12-02  Same 
2017-12-02  2017-12-02  Same 
2099-12-02  2099-12-02  Same 
9999-12-02  9999-12-02  Same 
+10000-12-02  +10000-12-02  Same 
+900000000-12-02 +900000000-12-02 Same 

だから書式設定のために、彼らが、共通の時代(「AD」)での年の同じですようだが、ではありません共通の時代の前に数年間。 yyyyは、年0がないとみなしてLocalDateの0年を1年としてレンダリングします。それはBCEであると理解されていますが、この情報は印刷されません。 ISOフォーマッタは、記号とすべてで文字通り年をとります。

yyyyの代わりにuuuuを使用すると、ISO_LOCAL_DATEの現象が表示されることがあります。

ここで「ローカル」とは、タイムゾーンがないことを意味し、ZonedDateTimeのタイムゾーン情報は印刷されません。これは、とにかく予想されません。

+1

もう1つの違いは、寛大な動作かもしれません。私が知る限り、定数フォーマッタは厳密であり、パターンベースのフォーマッタは構文解析においてスマートです。これはおそらく、 "2017-02-29"(strictモードでは拒否され、スマートモードでは調整された)のような式に関係します。 –

+0

はい、@MenoHochschild、私は構文解析の違いを考慮しなかった、確かにいくつかがあります。この方向へのあなたの貢献に感謝します。 –

1

ここでISOはISO-8601を意味します。そのフォーマットは現在、そしておそらく永久にyyyy-MM-dd(それはローカルなのでタイムゾーンはありません)です。しかし、あなた自身にこれに尋ねてください - あなたはISOフォーマットを望んでいますか、あるいはyyyy-MM-ddが欲しいですか?それらが同じであるという事実は、あなたにとって重要ではないはずです。標準的な表現を望むか、特定の表現を望むかのどちらかに基づいて決定しています。または、おそらく質問は "私はISO形式の日付が必要かどうかわかりません...私は?" - 答えは、すべてのものが等しい、あなたはおそらくそうです。