@JsonFormat注解是一个时间格式化注解,用于格式化时间。
比如存储在MYSQL中的数据是dateTime类型,将数据获取以后封装到实体类中的时候,就会变成英文的时间格式(Wed Jul 27 02:26:43 CST 2022),而不是yyyy-MM-dd HH:mm:ss格式的时间(2022-07-27 02:26:43),@JsonFormat注解就可以解决这个问题。
A. 该注解用于出参日期数据的时间格式化。
B. 那么入参日期数据的格式如何处理呢?也用同样的方案。
如果前端传来的为字符串格式的日期:“2022年07月29日 09时41分22秒”,则需要如下配置:
@JsonFormat(pattern = “yyyy年MM月dd日 HH时mm分ss秒”)
private Date createTime;
解析后存入DB中的则为:2022-07-29 09:41:22,查询时返回的数据则为:“2022年07月29日 09时41分22秒”
@JsonFormat注解不是SPRING自带的注解,所以使用该注解前需要添加jackson相关的依赖包。当然如果是 SpringBoot项目就不需要自己手动添加依赖了,因为在spring-boot-start-web下已经包含了jackson的相关依赖了。
<dependency>
<groupId>com.fasterxml.jackson.coregroupId>
<artifactId>jackson-databindartifactId>
<version>2.12.6version>
dependency>
在实体类属性上面使用@JsonFormat注解。
/**
* 创建时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
/**
* 更新时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
只是在将实体返回JSON格式数据时才有效的转换为(yyyy-MM-dd HH:mm:ss)格式的时间,其他时候日期格式不会被转换。
JASKSON在序列化时间时是按照国际标准时间GMT进行格式化的,而在国内默认时区使用的是CST时区,两者相差8小时,因为我们是东八区(北京时间),所以我们在格式化的时候要指定时区(timezone)。
中国时间(Asia/Shanghai) = 格林尼治时间(GMT)+ 8
格林尼治时间(GMT) = 世界协调时间(UTC) + 0
/**
* 创建时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
private Date createTime;
/**
* 更新时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
private Date updateTime;
GMT(格林尼治时间),Greenwich Mean Time ,这是以英国格林尼治天文台观测结果得出的时间,这是英国格林尼治这个地方的时间,是过去使用的世界标准的时间;
UT(世界时),Universal Time ,这是根据原子钟计算出来的时间。
UTC(世界协调时间),Coordinated Universal Time,因为地球自转越来越慢,每年都会比前一年多出零点几秒,每隔几年,协调世界时组织委员会都会给世界时+1秒,让基于原子钟的世界时和基于天文学的格林尼治标准时间相差不至于太大,是现在使用的世界标准时间。
协调世界时不与任何地区位置相关,也不代表此刻某个地区的时间,所以在说明某地时间时要加上时区。
也就是说:GMT并不等于UTC,而是等于UTC+0,只是格林尼治刚好在0时区上。
A. 中国时间(Asia/Shanghai) = 格林尼治时间(GMT)+ 8
B. 格林尼治时间(GMT) = 世界协调时间(UTC) + 0
url: jdbc:mysql://localhost:3306/servicex-single?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
@Target({ElementType.ANNOTATION_TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotation
public @interface JsonFormat {
String DEFAULT_LOCALE = "##default";
String DEFAULT_TIMEZONE = "##default";
// 表示序列化后日期的格式,比如:yyyy-MM-dd HH:mm:ss 或者 yyyy年MM月dd日 HH时mm分ss秒
String pattern() default "";
// 表示序列化后的一种类型,默认为JsonFormat.Shape.ANY
JsonFormat.Shape shape() default JsonFormat.Shape.ANY;
// 根据位置序列化的一种格式,默认为本地的语言简称,中国的语言简称为zh_CN
String locale() default "##default";
// 指定时区,默认是GMT,北京时间为:GMT+8
String timezone() default "##default";
OptBoolean lenient() default OptBoolean.DEFAULT;
JsonFormat.Feature[] with() default {};
JsonFormat.Feature[] without() default {};
...
}