这个问题在这里已有答案:
我正在解析服务器的访问日志文件,我想将字符串日期转换为即时,所以我可以将它与间隔边界进行比较。我有这样的字符串:
20 / Mar / 2019:00:00:01 +0100
我想立即解析它。我试过这段代码:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MMM/yyyy:hh:mm:ss Z");
TemporalAccessor temporalAccessor = formatter.parse(lo.time);
LocalDateTime localDateTime = LocalDateTime.from(temporalAccessor);
ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, ZoneId.systemDefault());
Instant result = Instant.from(zonedDateTime);
错误是这样的:
错误:无法在索引3处解析文本'20 / Mar / 2019:00:00:01 +0100'
似乎这个月有问题,但我很确定模式是好的。
您正在使用hh
,它是时钟小时的上午(1-12)而不在日期字符串中添加AM / PM信息。
相反,你应该使用像时间(0-23)的模式:DateTimeFormatter.ofPattern("dd/MMM/yyyy:HH:mm:ss Z");
或者您可以在日期模式中添加a
:
DateTimeFormatter.ofPattern("dd/MMM/yyyy:hh:mm:ss a Z");
并在日期字符串中传递AM / PM信息:
"20/Mar/2019:00:00:01 AM +0100"
编辑:
根据评论,问题也可能在于您正在使用的语言环境,为了使用en / US语言环境,只需将语言环境传递给ofPattern
方法:
Locale locale = new Locale("en", "US");
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MMM/yyyy:HH:mm:ss Z", locale);
但你仍然需要纠正上午时钟(hh
)到一小时(HH
)。