有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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接受我传递给它的偏移量,而不是让它聪明地使用自己的一组时区规则来执行转换


共 (2) 个答案

  1. # 1 楼答案

    AEST^{},它遵守夏令时,2016年的夏令时在4月3日结束,10月2日再次开始

    这意味着03 Mar 2016在DST中,这是+1100,而不是+1000

    ZonedDateTime.parse返回:

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

    转换为GMT将为您提供:

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

    调试代码时会显示这一点。我刚刚添加了print语句,让dateTimedateTimeInGMT都能看到它

  2. # 2 楼答案

    AEST时区现在是+11小时(DST),所以字符串+1000基本上被忽略,并且应用了-11小时偏移量

    您可以从测试中删除符号时区名称(AEST)并仅在+1000上中继,也可以调整测试