Дата составления с Джодой с часовым поясом
У меня есть две метки времени, которые описывают один и тот же момент времени в двух разных форматах.
2010-10-03 18:58:07
и 2010-10-03T16:58:07.000+02:00
.
Я разбираю временные метки с двумя разными форматами даты с Джодой. В конце я хочу иметь два объекта DateTime, которые равны по времени того же момента времени.
DateFormatter предлагает несколько методов для управления часовыми поясами и локалями, но я не мог заставить его работать.
Это код, который я хотел бы использовать:
final String date1 = "2010-10-03 18:58:07"; // Europe/Berlin local time
final DateTimeFormatter formatter1 = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
final DateTime dateTime1 = formatter1.parseDateTime(date1);
final String date2 = "2010-10-03T16:58:07.000+02:00"; // Europe/Berlin local time with time zone
final DateTimeFormatter formatter2 = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
final DateTime dateTime2 = formatter2.parseDateTime(date2);
Assert.assertTrue(dateTime1.isEqual(dateTime2));
Спасибо заранее, если кто-нибудь может мне помочь!
Ответы
Ответ 1
Если ваше зомби по умолчанию - Европа/Берлин, 2010-10-03 18:58:07 соответствует 2010-10-03T16: 58: 07.000 + 00: 00.
Вероятно, вы неправильно понимаете поле часового пояса в строчном представлении. Ваша отметка времени 2010-10-03T16: 58: 07.000 + 02: 00 означает, что "это 16:58:07 в часовом поясе с смещением +2 часа от GMT) или в другой формулировке" сейчас 16: 58: 07 в Берлине ". Я предполагаю, что вы ожидали, что это будет означать, что это 16:58:07 GMT?
Ответ 2
Ваши две временные метки не представляют собой один и тот же момент времени (как уже отмечал jambjo). См. Часовой пояс как смещение от UTC в википедии.
Также см. документацию parseDateTime о том, как она работает. Если вы не указали часовой пояс, тогда будет применяться часовой пояс по умолчанию (это часовой пояс в Берлине UTC + 2, если вы там). Итак:
-
2010-10-03 18:58:07
становится 2010-10-03T18:58:07.000+02:00
(18:58 в Берлине со смещением 2 часа до UTC, это означает 16:58 в UTC), как и ожидалось.
-
2010-10-03T16:58:07.000+02:00
остается как есть, потому что есть часовой пояс (т.е. 16:58 в Берлине со смещением от 2 часов до UTC, это означает 14:58 в UTC)
Надеюсь, у вас есть идея. Для получения желаемых результатов вам нужно будет отрегулировать время с помощью метода withZone.