2017-03-08 100 views
0

我需要一個可以傳遞語言環境(和樣式,可能)的方法,以及誰應該返回日期格式化字符串。例如getDateFormatString(new Locale("en-US"), FormatStyle.SHORT)會返回「M/dd/yy」。通過語言環境獲取日期格式

對於我來說,使用像DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT).withLocale(locale);這樣的東西來解析是不夠的,因爲我還需要解析格式變化,例如將M/dd解釋爲當年的日期,所以我想對原始格式字符串。

回答

0

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); 

類似類型包括YearMonthYearMonth

也可以使用ThreeTen-Extra項目查找更多使用java.time的類。

DateTimeFormatterBuilder

對於未通過格式化模式可能複雜的變化,可以考慮使用DateTimeFormatterBuilder建立一個DateTimeFormatter。搜索堆棧溢出進行討論和示例。

+0

我怎樣才能得到這個「M/D」模式?我需要算法返回美國語言環境的(或類似的),而塞爾維亞語區域設置爲「d.M」。我想在java8中解決它,並儘可能避免使用SimpleDateFormat類。 – zmau

+0

@zmau解析何時可能出現哪種格式?在字符串中搜索點或斜線。或嘗試任意解析一種格式,陷入異常,在這種情況下嘗試其他格式。更好的做法是在序列化這些值時使用標準的ISO 8601格式:月份日期的「--MM-DD」,例如1月23日爲' - 01-23'。 –

相關問題