Разобрать строку метки времени в Java с переменным количеством наносекунд - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть CSV, который содержит метки времени в следующих форматах:

гггг-мм-дд чч: мм: ссх

гггг-мм-дд ЧЧ: мм: сс.SX

гггг-мм-дд ЧЧ: мм: сс.SSX

гггг-мм-дд ЧЧ: мм: сс.SSSX

гггг-мм-дд ЧЧ: мм: сс.SSSSX

гггг-мм-дд ЧЧ: мм: сс.SSSSSX

гггг-мм-дд ЧЧ: мм: сс.SSSSSSX

Как мне разобрать строку, которая может содержать любой из вышеперечисленных форматов?

Следующий код может анализировать отметку времени, когда присутствует 3-6 наносекунд, но завершается неудачно, когда нет наносекунд или меньше 3:

String time = "2018-11-02 11:39:03.0438-04";
DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSSX");            
Date date = sdf.parse(time);
System.out.println("Date and Time: " + date.getTime());

В настоящее время у меня есть метод, который перебирает 0-6 и генерирует строку с числом «S», равным значению итерированной переменной. Метод пытается проанализировать строку в try / catch, пока строка не будет успешно проанализирована. Например, строка 2018-11-02 11:39:03.0438-04 попытается проанализировать пять раз, прежде чем она будет успешной.

CSV - это экспорт таблицы PostgreSQL, в которой есть столбцы с типом TIMESTAMP WITH TIME ZONE, и, похоже, он обрезает конечные позиции «0» наносекунд.

Я использую Java 8 и открыт для любых внешних библиотек (Joda?).

Ответы [ 3 ]

0 голосов
/ 07 ноября 2018

Я не уверен, но мне кажется, что-то вроде этого работает:

String time = "2018-11-02 11:39:03.0438-04";
DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSSX");            
Date date = sdf.parse(time);
System.out.println("Date and Time: " + date.getTime());

В общем, вы хотите максимально длинный формат, в данном случае с 6x S.

0 голосов
/ 07 ноября 2018

Вам лучше использовать Java Time API 1 из пакета java.time.

Date, SimpleDateFormatter и Calendar классы имеют недостатки и устарели.

Класс DateTimeFormatter предоставляет множество опций, поэтому вы можете настроить все, что вам нужно. Обратите внимание, что при использовании метода appendFraction, наносигналы добавляются справа.

String[] dateStrs = {
    "2018-11-02 11:39:03.4-04",
    "2018-11-02 11:45:22.71-04",
    "2018-11-03 14:59:17.503-04"
};

DateTimeFormatter f = new DateTimeFormatterBuilder()
    .appendPattern("yyyy-MM-dd HH:mm:ss.")
    .appendFraction(ChronoField.NANO_OF_SECOND, 1, 9, false)
    .appendPattern("X")
    .toFormatter();

// Single item:
LocalDateTime date = LocalDateTime.parse("2018-11-02 11:39:03.7356562-04", f);

// Multiple items:
List<LocalDateTime> dates = Arrays.asList(dateStrs).stream()
    .map(t -> LocalDateTime.parse(t, f))
    .collect(Collectors.toList());

1 Java 8 новый API даты и времени находится под сильным влиянием Joda Time. На самом деле основным автором является Стивен Колебурн, автор Joda Time.

0 голосов
/ 07 ноября 2018

Первые 19 символов идентичны.

Кроме того, у вас разные length с в разных случаях. Вы можете использовать switch для проверки length из String и обрабатывать отдельные case s для различных возможных значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...