通过语言环境获取日期格式
问题描述:
我需要一个可以传递语言环境(和样式,可能)的方法,以及谁应该返回日期格式化字符串。例如getDateFormatString(new Locale("en-US"), FormatStyle.SHORT)
会返回“M/dd/yy”。通过语言环境获取日期格式
对于我来说,使用像DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT).withLocale(locale);
这样的东西来解析是不够的,因为我还需要解析格式变化,例如将M/dd解释为当年的日期,所以我想对原始格式字符串。
答
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'。 –