rob*_*rob 11 java datetime localization java-8 java-time
我需要解析(德语)以下列形式的日期:
10. Jan. 18:14
8. Feb. 19:02
1. Mär. 19:40
4. Apr. 18:55
2. Mai 21:55
5. Juni 08:25
5. Juli 20:09
1. Aug. 13:42
[...]
Run Code Online (Sandbox Code Playgroud)
如您所见,如果月份超过4个字符,则会删除月份名称.甚至更奇怪,不要问我为什么,Mär.虽然整个名字都是3月,但是3月份缩短了März.我怎么解析这个java.time?(日期的格式是基于创建日期列表的Android设备的本地化.但是,我没有在Android上解析它)
我的方法是创建一个DateTimeFormatter这样的:
DateTimeFormatter.ofPattern("d. MMMM HH:mm").withLocale(Locale.GERMAN);
// or
DateTimeFormatter.ofPattern("d. MMMMM HH:mm").withLocale(Locale.GERMAN);
Run Code Online (Sandbox Code Playgroud)
但是MMMM这种MMMMM模式和模式都不适合缩短的日期.当然,我可以使用以下模式d. MMM. HH:mm来匹配缩短的月份,但是我无法匹配3个月和4个月的月份.我知道我可以有两个格式化程序(MMM. and MMMMM)但我宁愿有一个解决方案,我只有一个格式化程序,可能还有一个自定义语言环境或类似的东西.
Jod*_*hen 10
问题的答案是DateTimeFormatterBuilder类和appendText(TemporalField, Map)方法.它允许在格式化或解析时将任何文本与值相关联,从而有效且优雅地解决问题:
Map<Long, String> monthNameMap = new HashMap<>();
map.put(1L, "Jan.");
map.put(2L, "Feb.");
map.put(3L, "Mar.");
DateTimeFormatter fmt = new DateTimeFormatterBuilder()
.appendPattern("d. ")
.appendText(ChronoField.MONTH_OF_YEAR, monthNameMap)
.appendPattern(" HH:mm")
.parseDefaulting(ChronoField.YEAR, 2016)
.toFormatter();
System.out.println(LocalDateTime.parse("10. Jan. 18:14", fmt));
System.out.println(LocalDateTime.parse("8. Feb. 19:02", fmt));
Run Code Online (Sandbox Code Playgroud)
一些说明:
monthNameMap必须使用所有的12个月内填充parseDefaulting(YEAR, 2016)已添加,这样LocalDateTime.parse(String, DateTimeFormatter)可以直接使用.没有它,就没有一年,因此只有一个TemporalAccessor可以被解析(年份必须是闰年,如果解析2月29日)你可以使用DateTimeFormatterBuilder:
private static final DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.appendOptional(DateTimeFormatter.ofPattern("d. MMM. HH:ss"))
.appendOptional(DateTimeFormatter.ofPattern("d. MMMM HH:ss"))
.toFormatter(Locale.GERMAN);
Run Code Online (Sandbox Code Playgroud)
在此运行:
Stream.of(("10. Jan. 18:14\n" +
"8. Feb. 19:02\n" +
"1. Mär. 19:40\n" +
"4. Apr. 18:55\n" +
"2. Mai 21:55\n" +
"5. Juni 08:25\n" +
"5. Juli 20:09\n" +
"1. Aug. 13:42").split("\n"))
.map(formatter::parse)
.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
你得到:
{NanoOfSecond=0, MicroOfSecond=0, DayOfMonth=10, MonthOfYear=1, MilliOfSecond=0, SecondOfMinute=14, HourOfDay=18},ISO
{NanoOfSecond=0, MicroOfSecond=0, DayOfMonth=8, MonthOfYear=2, MilliOfSecond=0, SecondOfMinute=2, HourOfDay=19},ISO
{NanoOfSecond=0, MicroOfSecond=0, DayOfMonth=1, MonthOfYear=3, MilliOfSecond=0, SecondOfMinute=40, HourOfDay=19},ISO
{NanoOfSecond=0, MicroOfSecond=0, DayOfMonth=4, MonthOfYear=4, MilliOfSecond=0, SecondOfMinute=55, HourOfDay=18},ISO
{NanoOfSecond=0, MicroOfSecond=0, DayOfMonth=2, MonthOfYear=5, MilliOfSecond=0, SecondOfMinute=55, HourOfDay=21},ISO
{NanoOfSecond=0, MicroOfSecond=0, DayOfMonth=5, MonthOfYear=6, MilliOfSecond=0, SecondOfMinute=25, HourOfDay=8},ISO
{NanoOfSecond=0, MicroOfSecond=0, DayOfMonth=5, MonthOfYear=7, MilliOfSecond=0, SecondOfMinute=9, HourOfDay=20},ISO
{NanoOfSecond=0, MicroOfSecond=0, DayOfMonth=1, MonthOfYear=8, MilliOfSecond=0, SecondOfMinute=42, HourOfDay=13},ISO
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2418 次 |
| 最近记录: |