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 секунды, сотой секунды и миллисекунды?
Это дает исключение DateTimeParseException, как я уже упоминал выше.
Отметьте этот пост stackoverflow.com/questions/36188428/…
Проверьте ответ на дублированный вопрос с тегами, это отличное решение.
Вы знаете, что ваш код нельзя скомпилировать? При размещении вопроса о переполнении стека (а не о сообщении об ошибке компилятора) убедитесь, что это возможно, чтобы мы могли опробовать ваш код, увидеть, что он не работает так, как вы описываете, и попробовать предложенное нами исправление, прежде чем мы его разместим. Я получаю «шаблон не может быть преобразован в переменную», а затем «Этот метод должен возвращать результат типа long».
Вы можете просто выбрать шаблон с тремя 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)
@HadiJ отредактировал мой ответ - спасибо;)
Обратите внимание, что OP должен решить, означает ли 3
в 2018-07-19 23:11:52.3
3 миллисекунды или 300 миллисекунд, а также правую или левую панель соответственно.
@nos, ты совсем не прав. 23: 11: 52.3 всегда 300 мс. и 3 миллисекунды будут 23: 11: 52.003
@Vadim Это зависит от вашего вклада. Я проанализировал файлы, в которых .3 означает 300 миллисекунд. И даже файлы, в которых последний .3 означает 1/3 секунды.
@nos - ты издеваешься? как насчет основ математики? что означает миллисекунды в миллисекундах? и 0,3 никогда не означает 1/3 ... за исключением того, что этот файл создал кто-то без элементарных математических знаний :-)
ИМХО, это запутанное решение (хотя должно работать). Я бы не хотел в конечном итоге поддерживать этот код и, скорее всего, переписал бы его, если бы это сделал.
На самом деле ваш шаблон недалеко от принятого по умолчанию шаблона 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.
почему вы должны принимать формат 3? я думаю, что вам следует выбрать один единственный формат, в идеале
yyyy-MM-dd HH:mm:ss.SSS
, и сохранить его во всем приложении.