Springboot格式化给前端返回的时间格式
新增注解
@Documented
@Target({FIELD,METHOD})
@Retention(RUNTIME)
public @interface DateFormatTransform {
String pattern() default "";
}
新增注解执行逻辑
@Slf4j
@AllArgsConstructor
public class DateFormatTransformValidator extends JsonSerializer<Object> {
private String pattern;
@Override
public 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 {
@Override
public 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 {
@Bean
public 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;
}
结束
注意:不一定只能给时间转换时区,可以按需使用这个返参的格式化代码,可能是想在服务的所有返回的字段中加入统一的内容,也可以使用这个