LocalDateTime dateTime = LocalDateTime.parse("2018-01-30T23:59:59.000");
System.out.println(dateTime);
Это печатает:
2018-01-30T23: 59: 59
Ваша строка в формате ISO 8601.UTC или Всемирное координированное время не является форматом, это стандартное время, используемое для определения времени оставшегося использования в наших соответствующих часовых поясах.
Используемые вами классы даты и времени SimpleDateFormat
и Date
, давно устарели, а первые особенно печально известны.Я рекомендую вместо этого использовать java.time
, современный Java API даты и времени.Намного приятнее работать с ним.
A LocalDateTime
- это дата с временем суток без часового пояса или смещения от UTC.Его метод parse
с одним аргументом анализирует ISO 8601, поэтому явного средства форматирования не требуется.
Что пошло не так в вашем коде
В строке шаблона формата есть ряд проблем,Это одна из причин, почему вы должны оценить вышеупомянутое решение без какого-либо явного средства форматирования.Первое, что пойдет не так: ваша строка шаблона формата имеет двоеточие :
между секундами и миллисекундами, тогда как ваша строка даты и времени имеет точку .
.Вот почему вы получаете исключение.
Однако, исправляя это, ваш код выдает следующее Date
:
Вс 31 декабря 23:00:00 CET 2017
Это один месяц ожидания, а минуты и секунды отсутствуют.Потому что:
- Прописные буквы
YYYY
предназначены для недельного года и используются только с номером недели.Вам нужен строчный yyyy
для года. - Прописный
DD
для дня года.Вам нужно прописные буквы dd
для дня месяца. - Вы правильно использовали прописные буквы
MM
для месяца.Попытка повторить то же самое несколько минут не сработает.Возможно, вы уже можете догадаться: это строчные буквы mm
. - Не удивительно, что вам нужны строчные буквы
ss
для секунд. - Использование
MS
для миллисекунд интересно.SimpleDateFormat
принимает его как M
за месяц (который у нас уже был дважды) и за S
за миллисекунду.Вместо этого вам нужно было прописные буквы SSS
для трех цифр миллисекунд.
Ссылки