2016-03-02 76 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> 

我不明白是怎么回事错的,如果我有时间上午02时42分,我减去+10小时的偏差,那么我应该得到4:42 pm的结果(即小时是16)。

我将字符串转换为ZonedDateTime或其他代码错误的方式有问题吗?

编辑:

好了,它看起来像时区转换的东西我做忽略时间段偏移我通过,并考虑到实际的时区指定日期(即现在是白天在澳大利亚东部节省,所以真正的抵消是+1100而不是+1000)。

现在我的问题是,我如何让Java接受我传递它的偏移量,而不是使用它自己的一组时区规则来执行转换?

+1

Your aestDateTime日期字符串错误。删除'Date:'前缀。 – Andreas

+0

对不起,这应该不会出现,我仍然有同样的问题 – jcm

+0

*“我如何让Java接受偏移量我传递它”* @Lashane已经告诉你:**删除符号时区名称(AEST)** – Andreas

回答

1

AEST时区11小时现在(DST),所以串+1000基本上忽略-11小时偏移应用于

您可以从测试中去掉符号区名称(AEST),并只在接力+1000或调整测试

0

AESTAustralia/Sydney,其观察夏令时,以及2016年,DST 04月03日结束,10月2

再次启动这意味着03 Mar 2016是DST,这是+1100,而不是+1000

ZonedDateTime.parse回报:

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

转换为格林尼治标准时间为您提供:

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

调试您的代码会显示你这一点。我刚刚为dateTimedateTimeInGMT添加了打印语句以查看它。