文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

SpringBoot怎么根据用户系统时区动态展示时间

2023-07-04 23:47

关注

本篇内容介绍了“SpringBoot怎么根据用户系统时区动态展示时间”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

根据用户系统时区动态展示时间

当我们使用SpringBoot+Mysql开发系统时,总是统一设置UTC+8时区,这样用户在任何地区访问系统,展示的时间都是国内标准时间,体验不友好,下面通过获取当前用户系统所在的时区,给用户展示不同的时间。

一、用户时区的获取

我们可以通过JavaScript来获取系统所在的时区,然后统一设置在请求头里。

Intl.DateTimeFormat().resolvedOptions().timeZone; // Asia/Shanghai

二、核心代码

这里统一使用LocalDateTime,更方便的处理时区转换问题,通过标识当前LocalDateTime对象所属时区,然后转换为目标时区时间。

public LocalDateTime convertLocalDateTime(LocalDateTime localDateTime, ZoneId originZoneId,ZoneId targetZoneId){return localDateTime.atZone(originZoneId).withZoneSameInstant(targetZoneId).toLocalDateTime();}

三、SpringBoot返回json时统一处理时区

当程序从数据库中读取出并转换成LocalDateTime对象,并经过业务逻辑处理,这时候该对象还是属于UTC+8时区,对应的ZoneId=Asia/Shanghai,当需要返回给前端时,可以通过自定义jackson序列化器,在LocalDateTime转json前转换到用户目标时区。

@Configurationpublic class JacksonConfiguration{@Autowiredprivate JacksonProperties jacksonProperties;public static LocalDateTime convertLocalDateTime(LocalDateTime localDateTime, ZoneId originZoneId,ZoneId targetZoneId){return localDateTime.atZone(originZoneId).withZoneSameInstant(targetZoneId).toLocalDateTime();}public static class CustomLocalDateTimeSerializer extends JsonSerializer<LocalDateTime>{private DateTimeFormatter formatter;public CustomLocalDateTimeSerializer(DateTimeFormatter formatter){super();this.formatter = formatter;}@Overridepublic void serialize(LocalDateTime value, JsonGenerator generator, SerializerProvider provider)throws IOException{generator.writeString(convertLocalDateTime(value, ZoneId.of("Asia/Shanghai"), ZoneId.of("Africa/Sao_Tome")).format(formatter));}}public static class CustomLocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime>{private DateTimeFormatter formatter;public CustomLocalDateTimeDeserializer(DateTimeFormatter formatter){super();this.formatter = formatter;}@Overridepublic LocalDateTime deserialize(JsonParser parser, DeserializationContext context)throws IOException, JacksonException{return convertLocalDateTime(LocalDateTime.parse(parser.getText(), formatter), ZoneId.of("Africa/Sao_Tome"),ZoneId.of("Asia/Shanghai"));}}@Beanpublic Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer(){return builder ->{builder.serializerByType(LocalDateTime.class,new CustomLocalDateTimeSerializer(DateTimeFormatter.ofPattern(jacksonProperties.getDateFormat())));builder.deserializerByType(LocalDateTime.class,new CustomLocalDateTimeDeserializer(DateTimeFormatter.ofPattern(jacksonProperties.getDateFormat())));};}}

上面示例代码设定用户时区ZoneId=Africa/Sao_Tome,并且自定义处理了LocalDateTime反序列化器,当使用ResquestBody注解时,对象中的LocalDateTime属性值也会转换成UTC+8时区,不用再额外处理,可直接保存到数据库。

四、SpringBoot接收时间参数统一处理时区

除了上面所说通过ResquestBody注解来接收参数外,还可能通过Get或者Post参数来接收LocalDateTime对象,这时候我们就要自定义一个Converter来处理String转换到LocalDateTime,同时把用户提交的属于用户时区的对象转换成UTC+8时区对象。

@Configurationpublic class WebMvcConfiguration implements WebMvcConfigurer{@Autowiredprivate WebMvcProperties webMvcProperties;@Overridepublic void addFormatters(FormatterRegistry registry){registry.addConverter(new Converter<String, LocalDateTime>(){private LocalDateTime convertLocalDateTime(LocalDateTime localDateTime, ZoneId originZoneId,ZoneId targetZoneId){return localDateTime.atZone(originZoneId).withZoneSameInstant(targetZoneId).toLocalDateTime();}@Overridepublic LocalDateTime convert(String source){return convertLocalDateTime(LocalDateTime.parse(source,DateTimeFormatter.ofPattern(webMvcProperties.getFormat().getDateTime())),ZoneId.of("Africa/Sao_Tome"), ZoneId.of("Asia/Shanghai"));}});}}

“SpringBoot怎么根据用户系统时区动态展示时间”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯