java – 无法使用“HH:mm E d MMM YYYY”模式解析DateTimeFormatter

我正在从外部数据源检索日期/时间,这将以下列格式“5月5日星期六4: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处解析

任何帮助赞赏.

解决方法

LocalDateTime.parse()需要一个表示有效日期的String,即年份部分.
以这种方式调用方法后,您无法设置年份:

LocalDateTime.parse(time,formatter).withYear(2018);

必须先设置年份,否则parse()会抛出DateTimeParseException.

作为一种解决方法,您可以在输入中连接当前年份.

一些额外的说明:

>您使用的模式和文本格式的输入日期不完全匹配.
>您没有为解析操作指定区域设置.
这意味着它将根据运行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);

相关文章

HashMap是Java中最常用的集合类框架,也是Java语言中非常典型...
在EffectiveJava中的第 36条中建议 用 EnumSet 替代位字段,...
介绍 注解是JDK1.5版本开始引入的一个特性,用于对代码进行说...
介绍 LinkedList同时实现了List接口和Deque接口,也就是说它...
介绍 TreeSet和TreeMap在Java里有着相同的实现,前者仅仅是对...
HashMap为什么线程不安全 put的不安全 由于多线程对HashMap进...