我正在解析服务器的访问日志文件,我想将字符串日期转换为即时日期,以便可以将其与间隔边界进行比较。我有这样的字符串:
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”
似乎月份有问题,但是我很确定模式是好的。
答案 0 :(得分:2)
您使用的是hh
,它是 clock-hour-of-am-pm(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);
但是您仍然需要将 clock-hour-am-pm (hh
)改成 hour-of-day ({{1 }}。