2017-03-08 97 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'。 –

相关问题