代码之家  ›  专栏  ›  技术社区  ›  Alberson Melo

Spring boot+Jackson-始终将日期转换为UTC

  •  7
  • Alberson Melo  · 技术社区  · 7 年前

    我正在数据库中保存日期 ,所以我想规范我的Spring Boot Rest控制器接收日期的方式,这样服务就可以部署到世界上任何地方(AWS EC2等)。

    我试图设置以下属性,但没有帮助:

    spring.jackson.time-zone=UTC
    

    还有另一个属性,它总是 true

    spring.jackson.deserialization.adjust-dates-to-context-time-zone=true
    

    UTC 时区和我当前时区中的另一个时区 America/Sao_Paulo

    有效载荷示例:

    {"date":"2017-09-15T18:58:00.000Z"}
    

    当服务部署在圣保罗时,它会收到:

    2017-09-15 18:58:00.000000
    

    对的 .

    2017-09-15 15:58:00.000000
    

    这就是 不准确的 .

    LocalDateTime

    示例模型:

    import java.time.LocalDateTime;
    
    class Model {
        private LocalDateTime date;
    
        public LocalDateTime getDate() {
            return date;
        }
    
        public void setDate(LocalDateTime date) {
            this.date = date;
        }
    }
    

    示例资源:

    @RestController
    class Resource {
        @RequestMapping(consumes = MediaType.APPLICATION_JSON_VALUE, method = RequestMethod.POST)
        @ResponseBody
        public ResponseEntity<?> add(@RequestBody Model model) {
            System.out.println(model.getDate());
            // persistence ommited
            return ResponseEntity.created(URI.create("")).build();
        }
    }
    

    另一个限制:必须不注释我的模型类才能这样做。

    pom.xml (相关部分)

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.3.RELEASE</version>
    </parent>
    <dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-jsr310</artifactId>
        <version>2.8.5</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-jdk8</artifactId>
        <version>2.8.5</version>
    </dependency>
    
    1 回复  |  直到 7 年前
        1
  •  10
  •   desoss    7 年前

    我在生产环境中也遇到了类似的问题。 我在应用程序中用这种方法解决了这个问题。java(具有主方法的类):

    @PostConstruct
    void started() {
        TimeZone.setDefault(TimeZone.getTimeZone("Etc/UTC"));
    }