2017-03-08 6 views
0

私はロケール(とスタイル、おそらく)を渡すことができ、日付の書式設定文字列を返すべき方法が必要です。たとえばgetDateFormatString(new Locale("en-US"), FormatStyle.SHORT)は "M/dd/yy"を返します。ロケールで日付を取得する

構文解析にはDateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT).withLocale(locale);のようなものを使用するだけでは十分ではありません。たとえば、M/ddを現在の年の日付として解釈する必要があるため、元のフォーマット文字列。

答えて

0

TL; DR

LocalDate currentYearAtGivenMonthDay = 

Year.now( 
    ZonedId.of("America/Montreal") 
).atMonthDay(
    MonthDay.parse("1/7" , DateTimeFormatter.ofPattern("M/d" 
)) 

詳細

java.timeクラスは、いくつかの非常に特定のタイプを持っています。あなたの月 - 日のために

MonthDay

MonthDayクラスを使用します。 DateTimeFormatterを使用して、非標準(ISO 8601)形式の入力文字列を指定します。

DateTimeFormatter f = DateTimeFormatter.ofPattern("M/d"); 
MonthDay md = MonthDay.parse(yourInput , f); 

LocalDateを取得する年を割り当てます。

LocalDate ld = md.atYear(2017); 

Yearクラスを使用して、現在の年の代わりにハードコーディング年間の数を決定します。日付がゾーンによって世界中で異なり、したがって年12月31日を中心に変えることができ、任意の瞬間のためとして、同様の種類がYearMonthYearMonthが含ま

ZoneId z = ZonedId.of("America/Montreal"); 
Year currentYear = Year.now(z); 
LocalDate ld = currentYear.atMonthDay(md); 

1月1日

にタイムゾーンを指定します。

また、ThreeTen-Extraプロジェクトでは、java.timeで動作する他のクラスを調べます。パターンをフォーマットすることで可能ではない複雑な変動を

DateTimeFormatterBuilder

DateTimeFormatterBuilderを使用してDateTimeFormatterを構築することを検討してください。ディスカッションとサンプルについては、スタックオーバーフローを検索してください。

+0

「M/d」パターンはどのように取得できますか?私はそれを返すアルゴリズム(またはそれに類するもの)を米国のロケールに、 "d.M"をセルビアロケールに必要とします。そして、私はjava8でそれを解決し、可能であればSimpleDateFormatクラスの使用を避けたいと思います。 – zmau

+0

@zmauいずれかの形式が表示される場合の解析に使用しますか?文字列でドットまたはスラッシュを検索します。あるいは、あるフォーマットを任意に解析して、例外をトラップしてみてください。その場合、他のフォーマットを試してみてください。このような値をシリアル化するときは、標準のISO 8601フォーマットを使用することもできます:1月23日のような月日の '--MM-DD'は' --01-23'です。 –

関連する問題