前言
项目中,leader强制要求前后端必须使用utc时间格式进行交互,也就是返回给前端的时间换成utc,同时前端调用后面时间也使用utc时间格式
总体思路就是:
1.在返回和接收时间的UtcDto实体类上加上 @JsonFormat(pattern = “yyyy-MM-dd’T’HH:mm:ss.SSS’Z’”)
2.并且在application.yml配置spring mvc接收时间的格式也为 “yyyy-MM-dd’T’HH:mm:ss.SSS’Z’”
如下demo示例
一、项目结构
二、pom依赖
只需要引入springboot web start即可
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
完整pom文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.cch</groupId>
<artifactId>utcdemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>utcdemo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
三、application.yml配置如下
接收前端请求必须要有该配置,不然JsonFormat转换会失败
server:
port: 8888
spring:
mvc:
format:
date: yyyy-MM-dd'T'HH:mm:ss.SSS'Z' # 接收前端请求必须要有该配置,不然JsonFormat转换会失败
四、DateUtil
其实这个只是为方便管理时间格式
public class DateUtil {
public static final String UTC_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
}
五、UtcDto
在@JsonFormat 的pattern指定时间格式为UTC
package com.cch.utcdemo.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.util.Date;
/**
* @Author chenchanghui
* @date 2021/1/14 19:37
*/
@Data
public class UtcDto {
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
private Date createTime;
}
六、UtcController
@RestController
@RequestMapping("/testutc")
public class UtcController {
/**
* 后端返回utc时间给前端
* @return
*/
@RequestMapping(value = "", method = RequestMethod.GET)
public ResponseEntity getUtcDate() {
UtcDto utcDto = new UtcDto();
utcDto.setCreateTime(new Date());
return new ResponseEntity(utcDto, HttpStatus.OK);
}
/**
* 后端接收前端发送的utc时间
* @param utcDto
*/
@RequestMapping(value = "/query", method = RequestMethod.GET)
public void queryUtcDate(UtcDto utcDto) {
System.out.println(utcDto.getCreateTime());
}
}
七、测试
后端返回前端UTC时间格式,测试ok
前端发送UTC时间格式给后端,测试ok
总结
工作中,后端返回utc时间给前端,前端根据浏览器所在时区进行处理展示。
同时前端发送请求给后端的时间也根据浏览器所在时区进行转换才发送给后端。