gpt4 book ai didi

Java SimpleDateFormat 解析结果延迟一小时(是的,我设置了时区)

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:18:44 25 4
gpt4 key购买 nike

给我一​​个谜:为什么这个简单的 JUnit 断言会失败?

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 点。

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

最佳答案

公历的默认构造函数使用机器的本地时区。如果这与 UTC 不同,您会得到这种行为。尝试使用 GregorianCalendar(TimeZone) 构造函数并将 UTC 传递给它。

这会起作用:

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 解析结果延迟一小时(是的,我设置了时区),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15991285/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com