TL;博士
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日到1月1日
ZoneId z = ZonedId.of("America/Montreal");
Year currentYear = Year.now(z);
LocalDate ld = currentYear.atMonthDay(md);
類似類型包括YearMonth
和Year
和Month
。
也可以使用ThreeTen-Extra項目查找更多使用java.time的類。
DateTimeFormatterBuilder
對於未通過格式化模式可能複雜的變化,可以考慮使用DateTimeFormatterBuilder
建立一個DateTimeFormatter
。搜索堆棧溢出進行討論和示例。
我怎樣才能得到這個「M/D」模式?我需要算法返回美國語言環境的(或類似的),而塞爾維亞語區域設置爲「d.M」。我想在java8中解決它,並儘可能避免使用SimpleDateFormat類。 – zmau
@zmau解析何時可能出現哪種格式?在字符串中搜索點或斜線。或嘗試任意解析一種格式,陷入異常,在這種情況下嘗試其他格式。更好的做法是在序列化這些值時使用標準的ISO 8601格式:月份日期的「--MM-DD」,例如1月23日爲' - 01-23'。 –