Во-первых, для большинства целей не конвертируйте дату и время из одного строкового формата в другой. В вашей программе сохраняйте дату и время как правильные объекты даты и времени, а не строки. Когда вы принимаете строковый ввод, проанализируйте его первым делом. Только когда вам нужно выдать строку, отформатируйте дату и время в строку в требуемом формате.
Во-вторых, используйте java .time, современный Java API даты и времени для всех ваших дата и время работы. Работать с ней намного приятнее, чем со старыми, плохо спроектированными и давно устаревшими классами, включая DateFormat
, SimpleDateFormat
и Date
.
. Анализировать ввод, используя java .time
*. 1009 *
Выходные данные:
2020-02-13T15: 21: 08.100 + 11: 00 [Австралия / Мельбурн]
Форматирование с использованием java .time
//Required Format yyyy-dd-MM HH:mm:ss.SSS in Melbourne Timezone
DateTimeFormatter requiredFormatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss.SSS");
String formatted = dateTime.format(requiredFormatter);
System.out.println(formatted);
2020-02-13 15: 21: 08.100
Что пошло не так в вашем коде?
Когда я впервые пробовал ваш код, синтаксический анализ произошел для FEB
, потому что ваш код не указывает локаль, а мой Java использует не-Engli sh локаль по умолчанию.
Исправление, что я смог разобрать строку и получил те же результаты, что и вы (только в моем часовом поясе). Что происходит: SimpleDateFormat
принимает верхний регистр S
для обозначения миллисекунд , 1000 тысячных секунд, независимо от того, сколько S
есть и сколько цифр в строке для анализа. Таким образом, 100 000 000 миллисекунд были добавлены к вашей дате и времени. Это чуть больше одного дня. Таким образом, вы получили 14 февраля вместо 13 февраля, а также неправильное время суток. В отличие от современного DateTimeFormatter
верхний регистр S
означает доли секунды , поэтому он обрабатывает SSSSSSSSS
и SSS
так, как мы ожидаем.
Прописные буквы DD
для дня года, поэтому, используя это для анализа, вы получили 13-й день года (такой же, как 13 января) плюс ваши 100 000 секунд.
Прописные буквы HH
для часа дня с 00 по 23. Анализ с использованием HH
дал вам 03:21 дня (так же, как 03:21 AM) плюс ваши 100 000 секунд, независимо от того, что в вашей строке было указано PM
.
Ссылка