将文本转换为即时

时间:2019-03-31 09:32:46

标签: java date datetime-parsing

我正在解析服务器的访问日志文件,我想将字符串日期转换为即时日期,以便可以将其与间隔边界进行比较。我有这样的字符串:

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”

似乎月份有问题,但是我很确定模式是好的。

1 个答案:

答案 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 }}。