一、前文🔥
二、环境说明🔥
三、问题描述🔥
发现一个有意思的东西,不知道你们平时有没有注意到啊,就是你通过new Date()来获取当前系统时间,可写入数据库后时间会比当前时间少了八小时,整整8小时!那么针对该问题,我们有何办法让它精准获取北京时间呢?
很多小伙伴可能就会说了,直接将获取到该时间的基础上再加8小时不就好了,这是没问题,也可以!那么还有更简便优雅的方式么?
今天我们就来聊一聊它,看看我推荐的方案是不是比大多数小伙伴说的方式更为优雅?使用起来是不是更便捷?
那好,那么小伙伴们,接着往下看~
四、问题分析🔥
那来思考一个问题,为何本地获取的时间没有错,而存入数据库的时候时间却少8小时?其实这个问题,就跟mysql数据库有关系了。
你使用mybatis将本地的数据传入到mysql数据库接收的时候,数据库会对数据进行检测,会把date类型的数据自动转换为mysql所对应的时区,即0时区,所以date时间会自动减去8小时。
那么针对该问题,你有何方案呢?
五、解决方案🔥
如下呢,我提供两种解决相差8小时的解决方案,亲测有效。仅供参考,不喜勿喷。
1️⃣方案一
从数据库方面入手,既然是由于数据库机制,那么我们可以在数据库连接时指定时区参数serverTimezone,将它设置从[UTC]改为[GMT%2B8],即可。
具体添加如下演示:
application-test.yaml
2️⃣方案二
从获取到时间后进行解析校验,那方式就很多,你可以手动,也可以使用注解@JsonFormat,在你的entity实体类的Date字段上添加该注解,那么数据库传回的data数据就会当你转为json格式的时候就会自动转为北京时间了,这也就避免了时区差问题,前端使用也就无需再处理了,是不是很方便呐。
具体添加演示如下:
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
protected Date createTime;
要是还有同学不知道alibaba开源的json处理器,真推荐用起来,封装了很多日常使用到的序列号反序列化方法类。真的超级方便好用。
直接在你的pom.xml中添加如下依赖即可:
<!--fastjson-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.51</version>
</dependency>
如上就是我所推荐使用的两种方案,你们更倾向那种解决方案呀?或者有更好的解决方案,记得要下发评论区告知于我和我的那群小伙伴哟,独乐乐不如众乐乐。
... ...
好啦,以上就是解决时间相差8小时问题的所有解决方案内容啦,你们学废了么?如果对你有所帮助,还请不要忘记给bug菌[三连支持]哟。如果想获得更多的学习资源或者想和更多的技术爱好者一起交流,可以关注我的公众号『猿圈奇妙屋』,后台回复关键词领取学习资料、大厂面经、面试模板等海量资源,就等你来拿。
六、文末🔥
如果你还想要学习更多,小伙伴们大可关注bug菌专门为你们创建的专栏《bug调优》,都是我一手打下的江山,持续更新中,希望能帮助到更多小伙伴们。
我是bug菌,一名想走👣出大山改变命运的程序猿。接下来的路还很长,都等待着我们去突破、去挑战。来吧,小伙伴们,我们一起加油!未来皆可期,fighting!
最后送大家两句话,与诸君共勉!
☘️做你想做的人,没有时间限制,只要愿意,什么时候都可以开始。
🍀你能从现在开始改变,也可以一成不变;这件事,没有规矩可言,你可以活出最精彩的自己。