json Date格式化时间偏差8小时,而@JsonFormat注解有无法动态指定时区,如何解决?
use this method to set timezone and replace @JsonFormat(pattern = “yyyy-MM-dd HH:mm:ss”, timezone=“GMT+8”)
(1)Model field
@JSONField(format = DateTimeJsonFormatSerializer.TIME_FMT)//fastjson,JSON.toJSONString()
@JsonSerialize(using = DateTimeJsonFormatSerializer.class)//jackson,影响http request
@JsonDeserialize(using = DateTimeJsonFormatDeserializer.class)//jackson,影响http response
private Date deliverTime;
(2) DateTimeJsonFormatSerializer.java
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import lombok.extern.slf4j.Slf4j;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
@Slf4j
public class DateTimeJsonFormatSerializer extends JsonSerializer<Date> {
public static final String TIME_FMT="yyyy-MM-dd HH:mm:ss";
protected static ThreadLocal<SimpleDateFormat> THREAD_LOCAL = new ThreadLocal<SimpleDateFormat>() {
@Override
protected SimpleDateFormat initialValue() {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(TIME_FMT);
TimeZone timeZone = TimeZone.getDefault();
// TimeZone timeZone = TimeZone.getTimeZone("Asia/Shanghai");
simpleDateFormat.setTimeZone(timeZone);
return simpleDateFormat;
}
};
public DateTimeJsonFormatSerializer() {
log.info("DateTimeJsonFormatSerializer default timezone:" + TimeZone.getDefault().getID());
}
@Override
public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
jsonGenerator.writeString(THREAD_LOCAL.get().format(date));
}
}
(3)DateTimeJsonFormatDeserializer.java
import com.fasterxml.jackson.core.JacksonException;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import lombok.extern.slf4j.Slf4j;
import java.io.IOException;
import java.text.ParseException;
import java.util.Date;
import java.util.TimeZone;
@Slf4j
public class DateTimeJsonFormatDeserializer extends JsonDeserializer<Date> {
public DateTimeJsonFormatDeserializer() {
log.info("DateTimeJsonFormatDeserializer default timezone:" + TimeZone.getDefault().getID());
}
@Override
public Date deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JacksonException {
try {
return DateTimeJsonFormatSerializer.THREAD_LOCAL.get().parse(p.getText());
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
}
参考:
https://www.iditect.com/program-example/java--set-current-timezone-to-jsonformat-timezone-value.html
https://cloud.tencent.com/developer/article/2063631