gpt4 book ai didi

java - 设置了时区的 SimpleDateFormat 获得正确的值但时区错误

转载 作者:搜寻专家 更新时间:2023-10-31 19:51:51 26 4
gpt4 key购买 nike

我在 Spring 应用程序中进行了一个简单的测试,它的默认时区设置为 UTC:

@SpringBootApplication
public class MemberIntegrationApp {

@Autowired
private TimeZoneProperties timeZoneProperties;

@PostConstruct
void started() {
TimeZone.setDefault(TimeZone.getTimeZone(timeZoneProperties.getAppDefault())); // which is UTC
}

public static void main(String[] args) {
SpringApplication.run(MemberIntegrationApp.class, args);
}

}

而且,这个简单的测试:(测试类用@SpringBootTest注解来加载主类中的配置,并且应用了@SpringRunner)

/**
* Test the effect of setting timezone
*/
@Test
public void testTimezoneSettingOnSimpleDateFormat() throws ParseException {
SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String d = "2018-08-08 12:34:56";
log.info("Trying to parse the date string: {}", d);
Date result = f.parse(d);
log.info("The result should be 12:34 UTC: {}", result);

f.setTimeZone(TimeZone.getTimeZone("UTC"));
result = f.parse(d);
log.info("The result should be 12:34 UTC: {}", result);

f.setTimeZone(TimeZone.getTimeZone("Europe/Madrid"));
result = f.parse(d);
log.info("The result should be 10:34 CEST: {}", result);
log.info("Now the offset(depre): {}", result.getTimezoneOffset());
}

我有输出:

Trying to parse the date string: 2018-08-08 12:34:56
The result should be 12:34 UTC: Wed Aug 08 12:34:56 UTC 2018
The result should be 12:34 UTC: Wed Aug 08 12:34:56 UTC 2018
The result should be 10:34 CEST: Wed Aug 08 10:34:56 UTC 2018
Now the offset(depre): 0

现在,为什么第四行的值是正确的,但时区是错误的?它应该是 Europe/Madrid。偏移量(在 Java 8 中已弃用,好吧我可以原谅),它应该是 +0200,而不是 0。

它是 UTC,因为在 log.info() 中转换为字符串时,slf4j 会干扰????还是什么?我不这么认为,因为 System.out.println() 也给我 UTC。

我知道我应该使用 OffsetDateTime,但它是遗留的,我们暂时不能将所有日期字段更改为那个。我想知道为什么 Java 会错误地解析它。

用 SimpleDateFormat 解析时 Timezone.getDefault() 有什么作用? f.getTimezone() 是什么?他们似乎在流程的不同部分发挥作用......

我问这个问题,因为 Jackson 在内部使用 SimpleDateFormat 来处理日期字符串/格式化日期。 ObjectMapper 上的配置是否会影响映射器使用的 SimpleDateFormat

最佳答案

我不认为这是一个错误,而是对这些行的误解:

    f.setTimeZone(TimeZone.getTimeZone("Europe/Madrid"));
result = f.parse(d);
log.info("The result should be 10:34 CEST: {}", result);

这是什么意思?

您首先设置一个时区,告诉解析器您将要解析欧洲/马德里时区的时间。

然后你显示它。它无法猜测您想要它在哪个时区,因此它会在默认时区显示它,在您的情况下为 UTC。


注意:

  • UTC 时间实际上是 10:34,而马德里时间是 12:34,反之则不然。
  • Date.getTimezoneOffset()offset between UTC and the default timezone (因此在您的情况下为 0),与您用于配置解析器的时区无关。此外,自 java 1.1 以来它已被弃用,您不应该再使用它了。

要显示不同时区的日期值,可以使用SimpleDateFormat.format(),例如:

    f.setTimeZone(TimeZone.getTimeZone("UTC"));
log.info("UTC {}", f.format(new Date()));
f.setTimeZone(TimeZone.getTimeZone("Europe/Madrid"));
log.info("Europe/Madrid {}", f.format(new Date()));

关于java - 设置了时区的 SimpleDateFormat 获得正确的值但时区错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53322376/

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