Чтобы показать, что Андреас в комментарии достиг цели: я выполнил следующий фрагмент в часовом поясе America / Coral_Harbour (так как я не знал ваш точный часовой пояс, восточное стандартное время используется в нескольких (хотя и меньше после 8 марта, когда началось восточное летнее время)).
String date = "2020-03-12T01:23:45.678+0000";
System.out.println("This is the string: " + date);
DateTime dt = new DateTime(date);
DateTime dt2 = new DateTime(dt).toDateTime(DateTimeZone.getDefault());
System.out.println("This is the first time: " + dt);
System.out.println("This is the second time: " + dt2);
Вывод:
This is the string: 2020-03-12T01:23:45.678+0000
This is the first time: 2020-03-11T20:23:45.678-05:00
This is the second time: 2020-03-11T20:23:45.678-05:00
Сравните первые две строки и обратите внимание, что преобразование из UT C в EST уже произошло при разборе строки.
В качестве отступления, поскольку ваша строка имеет формат ISO 8601, вам не нужно указывать какой-либо форматер для ее анализа. Конструктор DateTime(Object)
принимает его. Но то же самое преобразование произошло в вашем анализе.
Что произошло в вашем коде?
Повтор цитаты из комментария Андреаса:
Если withOffsetParsed()
имеет вызывается, тогда результирующий DateTime будет иметь фиксированное смещение на основе проанализированного часового пояса. В противном случае результирующий DateTime будет иметь зону этого форматера, но проанализированная зона, возможно, вызвала настройку времени.
Таким образом, ваш форматтер имеет часовой пояс по умолчанию для вашего устройства, и, следовательно, также DateTime
объект, который вы получаете при разборе.
Итак, при создании dt2
вы конвертировали из восточного стандартного времени в восточное стандартное время и поэтому снова получили ту же дату-время.
Ссылка: Документация DateTimeFormatter.parseDateTime()