2011-01-07 3 views
13

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

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

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

ответ

6

Если ваше зомби по умолчанию - Европа/Берлин, 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?

+0

У вас есть тип в «2010-10-03T16: 58: 07.000 + 02: 00 означает, что он не 16:58:07 в часовом поясе с смещением +2 часа от GMT)». Он должен читать: «2010-10-03T16: 58: 07.000 + 02: 00 означает, что это 16:58:07 в часовом поясе со смещением +2 часа от UTC)« – MicSim

+0

Да, я ожидал, что это будет 16 : 58: 07 GMT. Тогда похоже, что временные метки только что сломаны. Это временные метки из двух разных файлов журналов разных серверов. И я уверен, что они указывают одно и то же событие. Итак, это была моя путаница. – wilfried

+0

@MacSim: Конечно, я написал немного слишком быстро. – jarnbjo

4

Ваши две временные метки не соответствуют одному и тому же моменту времени (как уже отмечалось jambjo). См. Time zone as offsets from 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 часа по Гринвичу, что означает 14:58 в UTC)

Надеется, что вы получили идею , Вам нужно будет отрегулировать время с помощью метода withZone, чтобы получить желаемые результаты.

Смежные вопросы