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日を中心に変えることができ、任意の瞬間のためとして、同様の種類がYearMonth
とYear
とMonth
が含ま
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
を構築することを検討してください。ディスカッションとサンプルについては、スタックオーバーフローを検索してください。
「M/d」パターンはどのように取得できますか?私はそれを返すアルゴリズム(またはそれに類するもの)を米国のロケールに、 "d.M"をセルビアロケールに必要とします。そして、私はjava8でそれを解決し、可能であればSimpleDateFormatクラスの使用を避けたいと思います。 – zmau
@zmauいずれかの形式が表示される場合の解析に使用しますか?文字列でドットまたはスラッシュを検索します。あるいは、あるフォーマットを任意に解析して、例外をトラップしてみてください。その場合、他のフォーマットを試してみてください。このような値をシリアル化するときは、標準のISO 8601フォーマットを使用することもできます:1月23日のような月日の '--MM-DD'は' --01-23'です。 –