LocalDateTime.parse はタイムゾーン情報を落として文字列の日付時刻をそのまま読み込むだけ。
一旦GMTのZonedDateTimeでパースして、withZoneSameInstantでJSTに変換した上でLocalDateTimeにする必要があると@btnrougeに教えて貰いました。
以下がコードとテストコードです。誰が書いてもこのような形になると思いますのでパブリックドメイン/CC0です。
private final static DateTimeFormatter gmtTimeFormatter = DateTimeFormatter.ofPattern("eee, dd MMM yyyy HH:mm:ss z", Locale.ENGLISH); private final static ZoneId JST = ZoneId.of("Asia/Tokyo"); private final static ZoneId GMT = ZoneId.of("GMT0"); static LocalDateTime parseLastModified(String lastModifiedStr) { return ZonedDateTime.from(gmtTimeFormatter.parse(lastModifiedStr)).withZoneSameInstant(JST).toLocalDateTime(); } static String formatLastModified(LocalDateTime lastModified) { return ZonedDateTime.of(lastModified, JST).withZoneSameInstant(GMT).format(gmtTimeFormatter); }
class HttpRequesterTest { @Test void parseLastModified() { assertEquals(LocalDateTime.of(2020,10,27,11,0,7), HttpRequester.parseLastModified("Tue, 27 Oct 2020 02:00:07 GMT")); } @Test void formatLastModified() { assertEquals("Tue, 27 Oct 2020 02:00:07 GMT", HttpRequester.formatLastModified(LocalDateTime.of(2020,10,27,11,0,7))); } }
HTTPレスポンスの Last-Modified をローカル時刻に変換したり、ローカル時刻を変換してIf-Modified-Sinceにするのに書きました。