Во-первых, не обрабатывайте дату и время как строки в вашей программе. Обрабатывайте их как правильные объекты даты и времени. Поэтому для всех, кроме самых простых одноразовых программ, вам не нужен метод, который преобразует строку из UT C в строку по лондонскому времени в другом формате.
Поэтому, когда вы принимаете ввод строки разобрать в DateTime
объект:
String stringInput = "2020-04-09T07:31:16Z";
DateTime dt = DateTime.parse(stringInput);
System.out.println("Date-time is: " + dt);
Выходные данные:
Дата и время: 2020-04-09T07: 31: 16.000Z
Я использую тот факт, что ваша строка в формате ISO 8601, по умолчанию для Joda-Time, поэтому нам не нужен явный форматер для ее синтаксического анализа.
Не до тех пор, пока вам не потребуется указать строку выведите дату и время в нужную зону и отформатируйте в нужную строку:
DateTimeZone zone = DateTimeZone.forID("Europe/London");
DateTime outputDateTime = dt.withZone(zone);
String output = outputDateTime.toString("h:mm aa");
System.out.println("Output is: " + output);
Вывод: 8:31
Что пошло не так в Ваш код
Z
в одинарных кавычках в строке шаблона формата неверен. Z
во входной строке является смещением 0 от UT C и должно быть проанализировано как смещение, иначе вы получите неверный результат. Никогда не ставьте эти кавычки вокруг Z
. withZoneRetainFields()
- это неправильный метод для преобразования часовых поясов. Название метода означает, что дата и час дня остаются неизменными, и изменяется только часовой пояс, что обычно приводит к другому моменту времени.
Произошло то, что ваша строка была проанализирована в 2020-04-09T07: 31: 16.000 + 01: 00, это тот же момент времени, что и 06:31:16 UT C, что неправильно. Затем вы заменили часовой пояс на UT C, сохранив время дня 07:31:16. Затем это время было отформатировано и напечатано.
Обдумайте java .time
Как сказал Фабьен, Joda-Time позже заменили на java .time, современный Java API даты и времени. На домашней странице Joda-Time написано:
Обратите внимание, что Joda-Time считается в основном «законченным» проектом. Никаких серьезных улучшений не планируется. Если используется Java SE 8, перейдите на java.time
(JSR-310).
Ссылки