@DateTimeFormat 和 @JsonFormat 注解使用

736 阅读1分钟

DateVO

/**
 * Json时间格式化注解日期格式测试
 *
 * @author jxnuxyhsz
 * @date 2021-11-19 12:06
 */
@Data
public class DateVO implements Serializable {
    /**
     * 不考虑其他框架支持, date 类型不能换成 String 类型
     */
    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date date;
}

DateController

/**
 * Json时间格式化注解日期格式测试
 *
 * @author jxnuxyhsz
 * @date 2021-11-19 12:08
 */
@RestController
@RequestMapping("/date/")
public class DateController {
    /**
     * 在数据绑定, SpringMVC将字符串参数自动转换为各种基本类型, 不使用注解 @DateTimeFormat 会报类型转换异常
     * @DateTimeFormat: spring-context包下, 按照指定格式接收前端传入时间, 默认转化为 CST 时区时间
     * 接收后的时间格式为:Fri Nov 19 14:45:35 CST 2021
     *
     * @param vo vo
     */
    @GetMapping("/input")
    public void inputDate(DateVO vo) {
        System.out.println("前端传入时间date1:" + vo.getDate());
    }
​
    /**
     * 不加 jackson 注解 @JsonFormat, 返回给前端时间格式:"2021-11-19T07:00:27.692+00:00"
     * 加上注解 @JsonFormat 会以指定格式返回给前端: "2021-11-19 15:01:57"
     * jackson在序列化时间时是按照国际标准时间 GMT 进行格式化的,而在国内默认时区使用的是 CST 时区
     *
     * @return dateVO
     */
    @GetMapping("/output")
    public DateVO outputDate() {
        DateVO dateVO = new DateVO();
        dateVO.setDate(new Date());
        return dateVO;
    }
​
​
    /**
     * @DateTimeFormat 同样支持 @RequestBody里面的 date 属性
     *
     * @param vo vo
     */
    @GetMapping("/requestBody")
    public void requestBodyDate(@RequestBody DateVO vo) {
        System.out.println("前端传入时间date:" + vo.getDate());
    }
}

数据要是从数据库查出来, 请保证数据库连接串和数据库时区保持一致。