SpringBoot项目的全球化时区支持

📅 2026/8/14 3:51:11
SpringBoot项目的全球化时区支持
最近公司做的App项目有国外版本但是才发现之前用的时间都是Java8的时间在国内用没有问题但是如果传给App本地化时区后就会出现时差的问题研究了一下怎么支持全球时区后写篇文章记录一下。首先是数据库连接时的时区设置// 常用的设置spring:datasource:url:jdbc:mysql://localhost:3306/你的库?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/ShanghaiuseSSLfalse// 如果需要支持全球化时区要设置为UTC serverTimezoneUTC数据库表设计CREATETABLEuser(idBIGINTPRIMARYKEYAUTO_INCREMENT,nameVARCHAR(50),create_timeDATETIME(3)NOTNULL,-- 存 UTC 时间update_timeDATETIME(3)NOTNULL);Java实体类importjava.time.Instant;publicclassUser{privateLongid;privateStringname;privateInstantcreateTime;privateInstantupdateTime;}Jackson配置ConfigurationpublicclassJacksonConfig{BeanpublicObjectMapperobjectMapper(){ObjectMapperobjectMappernewObjectMapper();// 忽略未知字段objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false);JavaTimeModulejavaTimeModulenewJavaTimeModule();// 强制 Instant 序列化为毫秒整数时间戳javaTimeModule.addSerializer(Instant.class,newJsonSerializerInstant(){Overridepublicvoidserialize(Instantvalue,JsonGeneratorgen,SerializerProviderserializers)throwsIOException{gen.writeNumber(value.toEpochMilli());// 返回 1786584470762 这种纯数字}});// 反序列化也支持毫秒时间戳javaTimeModule.addDeserializer(Instant.class,newJsonDeserializerInstant(){OverridepublicInstantdeserialize(JsonParserp,DeserializationContextctxt)throwsIOException{returnInstant.ofEpochMilli(p.getLongValue());}});objectMapper.registerModule(javaTimeModule);// 使用 UTC 时区objectMapper.setTimeZone(TimeZone.getTimeZone(UTC));// 枚举使用 toStringobjectMapper.configure(SerializationFeature.WRITE_ENUMS_USING_TO_STRING,true);returnobjectMapper;}}返回给前端的数据{id:1,name:张三,createTime:1754965576123,updateTime:1754965576123}最后前端随意按照时区去解析格式化就可以了。