Подтвердить что ты не робот

Дата составления с Джодой с часовым поясом

У меня есть две метки времени, которые описывают один и тот же момент времени в двух разных форматах.

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));

Спасибо заранее, если кто-нибудь может мне помочь!

4b9b3361

Ответ 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.