Пытаюсь создать паттерн чтобы разобрать дату/время Apache Access Log-a. Пример
'30/Nov/2016:04:13:36 +0200'
Задаю паттерн
private DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MMM/yyyy:HH:mm:ss Z");
В результате получаю exception при использовании метода parse:
Exception in thread "AWT-EventQueue-0" java.time.format.DateTimeParseException: Text '30/Nov/2016:04:13:36 +0200' could not be parsed at index 3
Как правильно задать паттерн для DateTimeFormatter-a? Вроде бы делаю все по документации, и все равно что-то не то.
Edit: Для шаблона
formatter = DateTimeFormatter.ofPattern("dd/MMM/yyyy:hh:mm:ss Z");
String datetime = "30/Nov/2016:04:13:36 +0200";
ZonedDateTime zonedDateTime = ZonedDateTime.parse(datetime, formatter);
Выдает точно такой же exception.
Exception in thread "AWT-EventQueue-0" java.time.format.DateTimeParseException: Text '30/Nov/2016:04:13:36 +0200' could not be parsed at index 3
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
public class Main{
private static DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MMM/yyyy:HH:mm:ss Z");
public static void main(String[] args){
String datetime = "30/Nov/2016:04:13:36 +0200";
ZonedDateTime zonedDateTime = ZonedDateTime.parse(datetime, formatter);
System.out.println(zonedDateTime.toString());
}
}
http://ideone.com/ojxwIQ
Как ни странно оригинальный шаблон компилируется и выполняется без ошибок на https://www.compilejava.net/.
Как оказалось причина проста - нужно указывать locale, иначе по неведомым мне причинам оно отказывается парсить в Idea.
private static DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MMM/yyyy:HH:mm:ss Z").withLocale(Locale.US);
Попробуйте так:
DateTimeFormatter.ofPattern("dd/MMM/yyyy:hh:mm:ss Z")
где:
Подробнее можно почитать в документации
Для вашего случая ZonedDateTime получается так:
String datetime = "30/Nov/2016:04:13:36 +0200";
TemporalAccessor time = DateTimeFormatter
.ofPattern("dd/MMM/yyyy:HH:mm:ss Z")
.parse(datetime);
LocalDateTime localDateTime = LocalDateTime.of(
time.get(YEAR),
time.get(MONTH_OF_YEAR),
time.get(DAY_OF_MONTH),
time.get(HOUR_OF_DAY),
time.get(MINUTE_OF_HOUR),
time.get(SECOND_OF_MINUTE));
ZoneId zone = ZoneOffset.from(time);
ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, zone);
Продвижение своими сайтами как стратегия роста и независимости