java转换时区指定为GMT的日期字符串
我有以下代码从给定的日期字符串中解析出ZonedDateTime
对象,输入字符串的格式如下:
"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小时的偏移量,那么我应该得到下午4:42的结果(即小时是16)
我将字符串转换为ZonedDateTime
的方式有问题吗?或者我的代码有其他问题吗
编辑:
好的,看起来我正在做的时区转换工作忽略了我传入的时区偏移量,并考虑了给定日期的实际时区(即,现在在东澳大利亚是夏令时,所以实际偏移量是+1100而不是+1000)
现在我的问题是,如何让Java接受我传递给它的偏移量,而不是让它聪明地使用自己的一组时区规则来执行转换
# 1 楼答案
AEST
是^{这意味着
03 Mar 2016
在DST中,这是+1100
,而不是+1000
ZonedDateTime.parse
返回:转换为GMT将为您提供:
调试代码时会显示这一点。我刚刚添加了print语句,让
dateTime
和dateTimeInGMT
都能看到它# 2 楼答案
AEST
时区现在是+11小时(DST),所以字符串+1000
基本上被忽略,并且应用了-11小时偏移量您可以从测试中删除符号时区名称(AEST)并仅在
+1000
上中继,也可以调整测试