jackson 格式化时间(SpringBoot)

181 阅读1分钟

环境准备

1. 创建项目,添加依赖

<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-web</artifactId> 
</dependency>

2. 创建实体类UserDTO

这里使用了lombok的@Data注解生成get,set方法。

@Data
public class UserDTO {
    private Date createTime;
}

3.创建controller层

@RestController
public class UserController {
    @GetMapping("/getUser")
    public List<UserDTO> getUser() {
        List<UserDTO> userList = new ArrayList<UserDTO>();
        for (int i=1; i<=3; i++) {
            UserDTO user = new UserDTO();
            user.setCreateTime(new Date());
            user.setUsername("gongj" + i);
            user.setId("j" + i);
            userList.add(user);
        }
        return userList;
    }
}

4. 测试效果

image.png

显然我们是不想要这种格式,不利于阅读。所以我们需要进行时间格式化,并更改时区。

第一种 注解方式

在需要进行时间格式化的字段上加上@JsonFormat注解,该注解属于jackson,SringBoot底层已经默认集成了Jackson。

@Data
public class UserDTO {
    private String id;
    private String username;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    private Date createTime;
}

使用该注解缺点是:项目可能有大量的时间字段,就需要在每个字段加上该注解,很麻烦。

第二种 修改默认配置

方法1. 重写MappingJackson2HttpMessageConverter

新建类,通过@Configuration将该类设置为配置类,

重写MappingJackson2HttpMessageConverter类。

@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter(){
    MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
    ObjectMapper om = new ObjectMapper();
    //全局修改json时间格式
    om.setDateFormat(new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"));
    converter.setObjectMapper(om);
    return converter;
}

方法2. 重写ObjectMapper

新建类,设置为配置类,重写ObjectMapper

@Bean
ObjectMapper objectMapper() {
    ObjectMapper om = new ObjectMapper();
    om.setDateFormat(new SimpleDateFormat("yyyy-MM-dd"));
    return om;
}

上述两种方法都是全局修改

第三种 配置文件(yml,properties)

1. yml配置方式

spring: jackson: date-format: yyyy/MM/dd timezone: GMT+8

2. properties配置方法

spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8
  • 如果第二种方式和第三种方式配置同时存在,以第三种方式为主。
  • 如果三种方式都存在的时候,以实体类中注解格式为主。