Java 8 DateTimeFormatter. Как задать pattern для записи даты Apache access log-a?

428
23 декабря 2016, 12:48

Пытаюсь создать паттерн чтобы разобрать дату/время 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
Answer 1
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);
Answer 2

Попробуйте так:

DateTimeFormatter.ofPattern("dd/MMM/yyyy:hh:mm:ss Z")

где:

  • 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);
READ ALSO
Условие закрытие пула потоков

Условие закрытие пула потоков

Есть вот такой вот участок кода:

360
Проблема с java кодом

Проблема с java кодом

Проблема в вычислении суммыВ первом коде использовали W(i+1)/Wi=f(i) - разница между текущим элементом и последующим, и складываем по очереди текущий...

295
Применение нейронных сетей и ИИ в Мобильных Приложениях.

Применение нейронных сетей и ИИ в Мобильных Приложениях.

Здравствуйте, хотелось бы узнать , примеры приложений , да и в целом, где и как применяются нейронные сети и ИИ в приложенияхСам пишу на java под...

339