【问题标题】:Spring-boot @RequestParam annotation converts UTC timezone in request to local timezoneSpring-boot @RequestParam 注释将请求中的 UTC 时区转换为本地时区
【发布时间】:2019-09-30 23:00:45
【问题描述】:

我有一个带有控制器的 spring-boot 应用程序,该控制器处理一些请求,其日期作为查询参数传递。例如请求的 URI:

http://localhost:8081/test/read?from=2018-01-01T00:00:00Z

但是,使用 @RequestParam 注释从 URI 中解析日期,我得到的是本地时区的日期,而不是 UTC 时区(如“Z”所示)。

我尝试在 application.properties 中设置 jdbctemplate 时区、java.util.timezone 和 spring.jackson.time_zone,但这并没有帮助。

@RequestMapping(value = "test/read", method = RequestMethod.GET)
    public ResponseEntity<String> get(
            @RequestParam(value="from") @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss'Z'") final Date from)
    // value of date in 'from' is in local timezone

由于传递给 @DateTimeFormat 的模式中的尾随“Z”,该值应位于 UTC 时区。

对我在这里缺少的东西有什么想法吗?

【问题讨论】:

标签: java spring-boot


【解决方案1】:

当您启动应用程序时,VM 会自动继承您本地机器的默认时区。您可以按以下方式更新应用程序的默认时区。

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        TimeZone.setDefault(TimeZone.getTimeZone("UTC"));

        SpringApplication.run(Application.class, args);
    }

}

【讨论】:

  • 这是一种解决方法 - 实际问题是日期模式具有常量 'Z' 而不是时区标识符,因此时区被忽略。
  • @1615903:我不认为这是一种解决方法。在我的项目中,我们特意设置了默认时区,以保证所有与日期相关的信息都保存在同一时区的数据库中。否则,当我们在不同区域的不同VM中部署微服务时,如果操作系统配置为自动从IP获取时区,它可能会带有不同的时区。
  • OP 描述的问题是参数中忽略了时区。您的解决方案是将默认时区设置为 UTC。时区仍然从参数中被忽略,但是因为它恰好与新的默认值相同,所以它现在可以工作了。这就是为什么我认为这是一种解决方法。
猜你喜欢
  • 1970-01-01
  • 2014-08-12
  • 2011-09-16
  • 2019-05-31
  • 2013-08-04
  • 1970-01-01
  • 2014-08-18
  • 2010-11-19
  • 2011-03-01
相关资源
最近更新 更多