Spring boot + Jackson - 始终将日期转换为 UTC
Spring boot + Jackson - Always convert dates to UTC
我在我的数据库中保存日期 没有时间戳 ,所以我想标准化我的 Spring 启动休息控制器接收日期的方式,所以这些服务可以部署在世界任何地方(AWS EC2 等)。
我尝试设置以下属性,没有帮助:
spring.jackson.time-zone=UTC
还有一个属性,一直是true
,所以没设置,就是:
spring.jackson.deserialization.adjust-dates-to-context-time-zone=true
我正在部署到 2 个单独的 Ubuntu 容器,一个在 UTC
时区,另一个在我当前的时区 America/Sao_Paulo
,即 (GMT -3)。
示例负载:
{"date":"2017-09-15T18:58:00.000Z"}
当服务部署在圣保罗时,它收到:
2017-09-15 18:58:00.000000
正确。
在 UTC 上部署服务时,它会收到:
2017-09-15 15:58:00.000000
不正确。
我将日期信息存储在 Java 中 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();
}
}
我无法更改我所有生产机器的时区,我必须与 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>
我在生产环境中也遇到过类似的问题。
我已经在我的 Application.java 中用这个方法解决了它(class with main 方法):
@PostConstruct
void started() {
TimeZone.setDefault(TimeZone.getTimeZone("Etc/UTC"));
}
希望对您有所帮助。
我在我的数据库中保存日期 没有时间戳 ,所以我想标准化我的 Spring 启动休息控制器接收日期的方式,所以这些服务可以部署在世界任何地方(AWS EC2 等)。
我尝试设置以下属性,没有帮助:
spring.jackson.time-zone=UTC
还有一个属性,一直是true
,所以没设置,就是:
spring.jackson.deserialization.adjust-dates-to-context-time-zone=true
我正在部署到 2 个单独的 Ubuntu 容器,一个在 UTC
时区,另一个在我当前的时区 America/Sao_Paulo
,即 (GMT -3)。
示例负载:
{"date":"2017-09-15T18:58:00.000Z"}
当服务部署在圣保罗时,它收到:
2017-09-15 18:58:00.000000
正确。
在 UTC 上部署服务时,它会收到:
2017-09-15 15:58:00.000000
不正确。
我将日期信息存储在 Java 中 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();
}
}
我无法更改我所有生产机器的时区,我必须与 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>
我在生产环境中也遇到过类似的问题。 我已经在我的 Application.java 中用这个方法解决了它(class with main 方法):
@PostConstruct
void started() {
TimeZone.setDefault(TimeZone.getTimeZone("Etc/UTC"));
}
希望对您有所帮助。