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 responseprivate 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>() {@Overrideprotected 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());}@Overridepublic 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());}@Overridepublic 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