Java SimpleDateFormat解析结果减少一小时(是的,我设置了时区) [英] Java SimpleDateFormat parse result off by one hour (and yes, I set the time zone)

查看:99
本文介绍了Java SimpleDateFormat解析结果减少一小时(是的,我设置了时区)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

让我感到困惑:为什么这个简单的JUnit断言失败?

Riddle me this: why does this simple JUnit assertion fail?

public void testParseDate() throws ParseException {
    final SimpleDateFormat formatter = new SimpleDateFormat(
            "yyyy-MM-dd HH:mm:ss z");
    formatter.setTimeZone(UTC);
    final Calendar c = new GregorianCalendar();
    c.setTime(formatter.parse("2013-03-02 11:59:59 UTC"));

    assertEquals(11, c.get(HOUR_OF_DAY));
}

我本来希望一天中的小时为11,但是根据JUnit的说法,一天中的小时为12.

I would have expected the hour of day to be 11, but according to JUnit, the hour of day is 12.

junit.framework.AssertionFailedError: expected:<11> but was:<12>
at junit.framework.Assert.fail(Assert.java:47)
    ... snip ...

推荐答案

公历的默认构造函数使用计算机的本地时区.如果这不同于UTC,则会出现此现象.尝试使用GregorianCalendar(TimeZone)构造函数并将UTC传递给该构造函数.

The default constructor of the Gregorian Calendar uses the local timezone of the machine. If that's different from UTC, you get this behavior. Try to use the GregorianCalendar(TimeZone) constructor and pass UTC into that.

这将起作用:

public void testParseDate() throws Exception {

    TimeZone UTC = TimeZone.getTimeZone("UTC");

    // Create a UTC formatter
    final SimpleDateFormat formatter = new SimpleDateFormat(
            "yyyy-MM-dd HH:mm:ss z");
    formatter.setTimeZone(UTC);

    // Create a UTC Gregorian Calendar (stores internally in UTC, so
    // get(Calendar.HOUR_OF_DAY) returns in UTC instead of in the
    // local machine's timezone.
    final Calendar c = new GregorianCalendar(UTC);

    // Ask the formatter for a date representation and pass that
    // into the GregorianCalendar (which will convert it into
    // it's internal timezone, which is also UTC.
    c.setTime(formatter.parse("2013-03-02 11:59:59 UTC"));

    // Output the UTC hour of day
    assertEquals(11, c.get(Calendar.HOUR_OF_DAY));
}

这篇关于Java SimpleDateFormat解析结果减少一小时(是的,我设置了时区)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆