在Spring boot项目中时区问题的解决

导言

最近公司开始弄国外项目,后来发现数据时间不对,我开始以为是默认的utc0时区,后来发现实际上是服务器时区。通过查资料终于时区问题。

写入

数据写入的时候需要把时区设置为0时区。

1
2
3
4
5
6
7
8
9
@SpringBootApplication
public class XXApplication {
//设置时区为0时区
@PostConstruct
void started() {
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
}
//省略main方法
}

使用

在后台使用是使用的Jackson库来序列化
并且我么能使用了自定义序列化,所以只需在DateFormat的时候统一指定GMT+8 即可

1
2
3
4
5
6
7
8
9
10
11
public class CustomDateTimeSerializer extends JsonSerializer<Date> {

@Override
public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//这里很关键,别写错了
formatter.setTimeZone(TimeZone.getTimeZone("GMT+8"));
String formattedDate = formatter.format(date);
jsonGenerator.writeString(formattedDate);
}
}

在需要序列化的字段上加上这个注解,即可

1
2
@JsonSerialize(using = CustomDateTimeSerializer.class)
private Date createTime;