Springboot格式化给前端返回的时间格式
- 新增注解
- 新增注解执行逻辑
- 建立注解及注解执行逻辑的关联
- 将时间转换注解注入Spring容器
- 在返回对象的属性中加入注解
- 结束
新增注解
@Documented
@Target({FIELD,METHOD})
@Retention(RUNTIME)
public @interface DateFormatTransform {String pattern() default "";
}
新增注解执行逻辑
@Slf4j
@AllArgsConstructor
public class DateFormatTransformValidator extends JsonSerializer<Object> {private String pattern;@Overridepublic void serialize(Object value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {try {// 获取header传入的时区String timeZoneStr = CurrentUserUtil.currentTimeZone();if(StringUtils.isBlank(timeZoneStr)){// 无需转换时区并返回原内容给前段jsonGenerator.writeObject(value);}else{Object outPut = value;if (value != null) {Date date = new Date();if (value instanceof Date) {date = (Date) value;} else if (value instanceof String) {date = DateUtils.parseDate(value);} else if (value instanceof Long) {date = new Date((Long) value);} else if (value instanceof LocalDateTime) {date = Date.from( ((LocalDateTime) value).atZone( ZoneId.systemDefault()).toInstant());} else if (value instanceof LocalDate) {date = Date.from(((LocalDate) value).atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());}TimeZone timeZone = TimeZone.getTimeZone(timeZoneStr);SimpleDateFormat currentTime = new SimpleDateFormat(pattern);currentTime.setTimeZone(timeZone);outPut = DateUtils.parseDate(currentTime.format(date),pattern);}// 转换时区并返回给前端jsonGenerator.writeObject(outPut);}}catch (Exception e){log.error("data transform error:", e);}}
}
建立注解及注解执行逻辑的关联
public class DateFormatTransformAnnotationIntrospector extends JacksonAnnotationIntrospector {@Overridepublic Object findSerializer(Annotated annotated) {DateFormatTransform formatTransform = annotated.getAnnotation(DateFormatTransform.class);if(formatTransform != null){return new DateFormatTransformValidator(formatTransform.pattern());}return super.findSerializer(annotated);}
}
将时间转换注解注入Spring容器
@Configuration
public class WebServerConfig {@Beanpublic MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();converter.setDefaultCharset(StandardCharsets.UTF_8);ObjectMapper objectMapper = converter.getObjectMapper();objectMapper.setAnnotationIntrospector(new DateFormatTransformAnnotationIntrospector());return converter;}
}
在返回对象的属性中加入注解
@Data
public class TestVo {@DateFormatTransform(pattern = "yyyy-MM-dd HH:mm:ss")private Date createTime;
}
结束
注意:不一定只能给时间转换时区,可以按需使用这个返参的格式化代码,可能是想在服务的所有返回的字段中加入统一的内容,也可以使用这个