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

Alb*_*elo 5 java spring-mvc spring-boot java-time jackson2

我在没有时间戳的情况下将日期保存在我的数据库中,因此我希望我的Spring Boot Rest控制器接收日期的方式标准化,因此可以在世界任何地方部署服务(AWS EC2等).

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

spring.jackson.time-zone=UTC
Run Code Online (Sandbox Code Playgroud)

还有另一个属性,总是true,所以我没有设置,那就是:

spring.jackson.deserialization.adjust-dates-to-context-time-zone=true
Run Code Online (Sandbox Code Playgroud)

我正在部署到2个独立的Ubuntu容器,一个在UTC时区,另一个在我当前的时区America/Sao_Paulo,即(GMT -3).

示例负载:

{"date":"2017-09-15T18:58:00.000Z"}
Run Code Online (Sandbox Code Playgroud)

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

2017-09-15 18:58:00.000000
Run Code Online (Sandbox Code Playgroud)

这是正确的.

在UTC上部署服务时,它会收到:

2017-09-15 15:58:00.000000
Run Code Online (Sandbox Code Playgroud)

这是不正确的.

我用Java存储日期信息LocalDateTime.

示例型号:

import java.time.LocalDateTime;

class Model {
    private LocalDateTime date;

    public LocalDateTime getDate() {
        return date;
    }

    public void setDate(LocalDateTime date) {
        this.date = date;
    }
}
Run Code Online (Sandbox Code Playgroud)

示例资源:

@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();
    }
}
Run Code Online (Sandbox Code Playgroud)

我不能改变所有生产机器的时区,我必须用Jackson和Java解决这个问题(如果可能的话).

另一个限制:不能注释我的模型类来执行此操作.

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>
Run Code Online (Sandbox Code Playgroud)

des*_*oss 7

我在生产环境中也遇到过类似的问题.我在我的Application.java(带有main方法的类)中用这个方法解决了它:

@PostConstruct
void started() {
    TimeZone.setDefault(TimeZone.getTimeZone("Etc/UTC"));
}
Run Code Online (Sandbox Code Playgroud)

希望它可以帮到你.

  • 你的答案确实有效,问题是我的数据库配置。谢谢。 (2认同)