Я следующий код, чтобы разобрать на 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 принять смещение, которое я передаю, вместо того, чтобы быть умным и использовать свой собственный набор правил часового пояса для выполнения преобразования?
Ваша строка даты aestDateTime неверна. Удалите префикс 'Date:'. – Andreas
Извините, этого не должно было быть, я все еще имею ту же проблему – jcm
* «как я могу заставить Java принять смещение, которое я передаю» * @Lashane уже сказал вам: ** Удалить символическое имя часового пояса (AEST) ** – Andreas