2016-03-02 2 views
0

Я следующий код, чтобы разобрать на ZonedDateTime объект из заданной строки даты, строка ввода отформатирован следующим образом:Преобразование строки даты с временной зоны, указанной в GMT

"Thu, 03 Mar 2016 02:42:00 +1000 (AEST)"

Мой синтаксический анализ кода как это:

public ZonedDateTime parseDate(String dateString) throws Exception { 
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("ccc, dd MMM yyyy HH:mm:ss Z (z)"); 
    ZonedDateTime dateTime = ZonedDateTime.parse(dateString, formatter); 
    ZoneId gmt = ZoneId.of("GMT"); 
    ZonedDateTime dateTimeInGMT = dateTime.withZoneSameInstant(gmt); 
    return dateTimeInGMT; 
} 

и у меня есть этот тест единицы:

@Test 
public void shouldParseTimezone() throws Exception { 
    MailFileParserJava parser = new MailFileParserJava(); 
    String aestDateTime = "Thu, 03 Mar 2016 02:42:00 +1000 (AEST)"; 
    ZonedDateTime aestZone = parser.parseDate(aestDateTime); 
    assertThat(aestZone.getDayOfMonth(), is(2)); 
    assertThat(aestZone.getHour(), is(16)); 
} 

, но мой блок тест терпит неудачу на getHour() утверждение -

Expected: is <16> 
    but: was <15> 

Я не понимаю, что происходит не так, если у меня есть время 2:42 утра, и я вычесть +10 час смещение, то я должен получить результат 16:42 (т.е. час - 16).

Есть ли проблема с тем, как я преобразовываю строку в ZonedDateTime или что-то еще не так с моим кодом?

EDIT:

Хорошо, это похоже на время преобразования зоны вещью я делаю не учитывает смещение часового пояса я прохожу в, и принимает во внимание фактический часовой пояс для указанной даты (то есть прямо сейчас дневной свет экономия в Восточной Австралии, поэтому реальное смещение составляет +1100 вместо +1000).

Теперь мой вопрос: как я могу заставить Java принять смещение, которое я передаю, вместо того, чтобы быть умным и использовать свой собственный набор правил часового пояса для выполнения преобразования?

+1

Ваша строка даты aestDateTime неверна. Удалите префикс 'Date:'. – Andreas

+0

Извините, этого не должно было быть, я все еще имею ту же проблему – jcm

+0

* «как я могу заставить Java принять смещение, которое я передаю» * @Lashane уже сказал вам: ** Удалить символическое имя часового пояса (AEST) ** – Andreas

ответ

1

AEST часовой пояс +11 часов прямо сейчас (DST), поэтому строка +1000 в основном игнорируется и -11 часов офсетные применяется

вы можете либо удалить символическое имя часового пояса (AEST) из теста и реле только на +1000 или настроить тест

0

AEST является Australia/Sydney, который отмечает переход на летнее время, и на 2016 год, DST заканчивается 3 апреля и снова начинается окт 2.

Это означает, что 03 Mar 2016 в DST, который +1100, а не +1000.

ZonedDateTime.parse возвращается:

2016-03-03T02:42+11:00[Australia/Sydney] 

Преобразование GMT ​​дает вам:

2016-03-02T15:42Z[GMT] 

Отладка кода показал бы вам это. Я просто добавил заявления для печати как для dateTime, так и для dateTimeInGMT.

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