我正在从外部数据源检索日期/时间,这将以下列格式“5月5日星期六14:30”返回,没有年份。
我一直试图将此解析为LocalDateTime失败。返回的数据不会返回一年,因为我们假设我们一直在当年运营。
//date to parse
String time = "14:30 Sat 05 May";
//specify date format matching above string
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm E d MMM YYYY") ;
//we do not have a year returned but i can make the assumption we use the current year
LocalDateTime formatDateTime = LocalDateTime.parse(time, formatter).withYear(2018);
以上代码抛出以下异常
线程中的异常“main”java.time.format.DateTimeParseException:Text '14:30 Sat 05 May'无法在索引16处解析
任何帮助表示感谢。
答案 0 :(得分:3)
LocalDateTime.parse()
预计String
代表有效日期,year
部分。
以这种方式调用此方法后,您无法设置年份:
LocalDateTime.parse(time, formatter).withYear(2018);
必须先设置年份,否则parse()
会抛出DateTimeParseException
。
作为一种解决方法,您可以在输入中连接当前年份。
一些补充说明:
Locale
这意味着它将根据运行JVM的本地工作
为了确保它在任何情况下都有效,您应该指定Locale
。 所以你可以尝试类似的东西:
//date to parse
String time = "14:30 Sat 05 May";
time += " " + LocalDate.now().getYear();
//specify date format matching above string
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm EEE dd MMM yyyy", Locale.US) ;
//we do not have a year returned but i can make the assumption we use the current year
LocalDateTime formatDateTime = LocalDateTime.parse(time, formatter);
答案 1 :(得分:3)
使用DateTimeFormatter
课程,通过调用DateTimeFormatterBuilder
并使用parseDefaulting
指定年份字段,在ChronoField.YEAR
中指定默认年份。
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.appendPattern("HH:mm E d MMM")
.parseDefaulting(ChronoField.YEAR, 2018) // <------
.toFormatter(Locale.ENGLISH);
使用此格式化程序代替您的格式化程序:
LocalDateTime.parse( "14:30 Sat 05 May" , formatter )
......我明白了:
2018-05-05T14:30
注意事项:
YYYY
。YYYY
。它是基于周的年份,仅适用于周数。如果您的字符串中包含一年,则应使用uuuu
或小写yyyy
。