Единый шаблон для даты и времени Java 8

public static long convertDateTimeToEpochMillis(String eventDate,String eventTime) {
    String patternMills = "yyyy-MM-dd HH:mm:ss.SSS";           
    DateTimeFormatter dtf = DateTimeFormatter.ofPattern(pattern);
    LocalDateTime localDateTime = LocalDateTime.parse(eventDate + " " + 
    eventTime, dtf);
}

Это вызывает исключение синтаксического анализа, когда я передаю 2018-07-19 23:11:52.3, но успешно выполняет синтаксический анализ на наличие 2018-07-19 23:11:52.312. Я не хочу указывать 3 разных шаблона для разного времени, например yyyy-MM-dd HH:mm:ss.S, yyyy-MM-dd HH:mm:ss.SS и yyyy-MM-dd HH:mm:ss.SSS.

Могу ли я предоставить один шаблон, который займет до 1/10 секунды, сотой секунды и миллисекунды?

почему вы должны принимать формат 3? я думаю, что вам следует выбрать один единственный формат, в идеале yyyy-MM-dd HH:mm:ss.SSS, и сохранить его во всем приложении.

TheOni 09.08.2018 22:13

Это дает исключение DateTimeParseException, как я уже упоминал выше.

Amol Aggarwal 09.08.2018 22:15

Отметьте этот пост stackoverflow.com/questions/36188428/…

DimaSan 09.08.2018 22:19

Проверьте ответ на дублированный вопрос с тегами, это отличное решение.

Marcos Vasconcelos 10.08.2018 00:19

Вы знаете, что ваш код нельзя скомпилировать? При размещении вопроса о переполнении стека (а не о сообщении об ошибке компилятора) убедитесь, что это возможно, чтобы мы могли опробовать ваш код, увидеть, что он не работает так, как вы описываете, и попробовать предложенное нами исправление, прежде чем мы его разместим. Я получаю «шаблон не может быть преобразован в переменную», а затем «Этот метод должен возвращать результат типа long».

Ole V.V. 10.08.2018 20:30
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
5
125
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете просто выбрать шаблон с тремя SSS по умолчанию.

String patternMills = "yyyy-MM-dd HH:mm:ss.SSS"; 

и при необходимости заполните правую часть даты нулями

String eventDate = "2018-07-19 23:11:52.3";
String millis = eventDate.substring(eventDate.lastIndexOf('.')+1);

if (millis.length() < 3) 
    eventDate += Stream.generate(() -> "0").limit(3 - millis.length()).collect(Collectors.joining(""));

или используйте хороший метод apache:

StringUtils.rightPad(eventDate, 23, '0'); // 23 is string length for "yyyy-MM-dd HH:mm:ss.SSS" pattern

В любом случае вы также можете добавить некоторую проверку, чтобы проверить оставшуюся часть строки даты

Я не знаю, что это правильный ответ, но вместо split используйте eventDate.substring(eventDate.lastIndexOf(".")+1)

Hadi J 09.08.2018 22:27

@HadiJ отредактировал мой ответ - спасибо;)

m.antkowicz 09.08.2018 22:28

Обратите внимание, что OP должен решить, означает ли 3 в 2018-07-19 23:11:52.3 3 миллисекунды или 300 миллисекунд, а также правую или левую панель соответственно.

nos 09.08.2018 22:39

@nos, ты совсем не прав. 23: 11: 52.3 всегда 300 мс. и 3 миллисекунды будут 23: 11: 52.003

Vadim 09.08.2018 22:48

@Vadim Это зависит от вашего вклада. Я проанализировал файлы, в которых .3 означает 300 миллисекунд. И даже файлы, в которых последний .3 означает 1/3 секунды.

nos 09.08.2018 23:49

@nos - ты издеваешься? как насчет основ математики? что означает миллисекунды в миллисекундах? и 0,3 никогда не означает 1/3 ... за исключением того, что этот файл создал кто-то без элементарных математических знаний :-)

Vadim 10.08.2018 17:57

ИМХО, это запутанное решение (хотя должно работать). Я бы не хотел в конечном итоге поддерживать этот код и, скорее всего, переписал бы его, если бы это сделал.

Ole V.V. 10.08.2018 20:24

ISO 8601

На самом деле ваш шаблон недалеко от принятого по умолчанию шаблона LocalDateTime.parse, использующего стандартный формат ISO 8601.

Так, может быть, вам будет достаточно поставить не пробел, а букву T?

Тогда DateTimeFormatter вообще не нужен.

LocalDateTime localDateTime = LocalDateTime.parse(eventDate + "T" + 
eventTime);

Он принимает любое количество цифр в миллисекундах от 0 до 9.

✔ Действительно, я подтвердил, что LocalDateTime.parse( "2018-07-19T23:11:52.3" ).toString() работает, давая 2018-07-19T23:11:52.300 в Java 10.0.1.

Basil Bourque 10.08.2018 00:05

Другие вопросы по теме