Monodb日期存储差8小时分析与解决,同时引出时间分析
1、时间标准
UTC(世界标准时间)
其以原子时秒长为基础,在时刻上尽量接近于格林尼治标准时间。
GMT(格林尼治平时)
位于英国伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线。
CST(北京时间)
中国标准时间。在时区划分上,属东八区,比协调世界时晚8小时,记为UTC+8 / GMT+8。
2、java中的时间
我们在java中new一个时间对象,看一下是怎么样的时间。
通过上图可以看出,这个时间是CST,同时还是Asia/Shanghai地区的。这就奇怪了,程序是怎么知道我们的所在地区呢?其实,如果我们什么都不设置,程序默认是读取系统时间的。
3、分析Mongodb时间问题
有了以上两个基础知识,现在我们要分析Mongodb的时间问题。通过java的MongoTemplate新增保存的日期,数据库中存储的日期会少了8小时。
在com.mongodb.util.JSONSerializers源码类中的LegacyDateSerializer内部类中,mongodb对存储日期做了如下处理:
从源码中可以看到,Mongodb在存储时间的时候,会把UTC格式存为GMT格式。
4、解决方式
1)不处理
Mongodb虽然减了8小时进行存储,但通过程序查出到Date对象的时候,神奇的事情发生了,差的8小时居然回来了,这又是为什么呢?
我们用Date的特性套进这个问题分析一下,由于数据库存储的时间格式为GMT,系统的格式为CST(UTC+8),所以当数据查出来赋值给Date的时候,jdk或者MongoTemplate代码帮我们把GMT转成了CST。虽然我没有找到源码来验证这个过程,可是通过断点数据更加印证了我的猜想,如下:
2)存储的时候处理
如果你一定要把当前时区的时间存储到Mongdb中,可以在存储到Mongo前给时间加上8小时,代码就不贴了,网上一搜一大堆。
5、扩展
当后端返回Date类型到前端的时候,需要在实体中增加@JsonFormat注释,这个可以帮我们处理格式化,很多人都是用下面这种写法。
@JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
这样写大部分时候都不会有问题,但是有可能会出现加了8小时还是少了1小时的问题。
这是因为GMT+8代表的是东时区,不代表中国时区,Asia/Shanghai 这个代表的是中国的时区,但在历史中,有国家(包含中国)政策颁布了在1986-1991年等还存在夏令时。在这样的时间区间,夏季时,会将时间拨快1个小时(即东9区时间),夏季结束时会再次将时间拨回一个小时(即东8区时间)。所以我们要把上面的代码修改成如下:
@JsonFormat(locale = "zh", timezone = "Asia/Shanghai", pattern = "yyyy-MM-dd HH:mm:ss")
6、总结
其实这个文章不止为了研究Mongodb的时间问题,很多其他的时间问题都可以套用这个分析过程进行分析解决,只要理解清楚时间的格式。
Monodb日期存储差8小时分析与解决,同时引出时间分析相关推荐
- Netty4.x: Server端 设置 option 警告 Unknown channel option ‘xxxx‘ for channel 分析及解决 (附源码分析)
一.问题背景: 最近某springboot项目想嵌入一个用户聊天功能,打算使用 Rabbitmq + Netty4.x + Redis 来开发高性能聊天功能.花费三天时间所有功能都已实现.启动时却警告 ...
- mysql自动插入的时间不对 差8小时
MySQL插入时间差八小时问题的解决方法 更新时间:2019年12月15日 10:19:12 转载 作者:lankeren 这篇文章主要给大家介绍了关于MySQL插入时间差八小时问题的解决方法,文 ...
- java-jvm-full gc频繁的分析及解决
返回博客列表 转 关于施用full gc频繁的分析及解决 DEC_LIU 发布时间: 2013/10/13 20:32 阅读: 3431 收藏: 14 点赞: 1 评论: 1 关于应用full gc频 ...
- 运营分析:用七种维度来分析广告投放效果
运营分析 随着互联网的飞速发展,各种网络产品应运而生,如电商网站,移动应用,视频媒体,新媒体等等.网络广告也成为了一种主要的广告形式.而网络广告的形式具有复杂和多样化的特点. 在网络营销中,运营人员经 ...
- 最小阻力之路,系统问题分析与解决八步法
最小阻力之路,系统问题分析与解决八步法 时间:3day 课程背景 企业的管理者,都是解决问题的高手,而我们为什么却总是发现"今天"的问题来自"昨天"的解决方案, ...
- 针式打印机及微型打印机突然不能打印的问题分析和解决办法
针式打印机及微型打印机突然不能打印的问题分析和解决办法 问题描述分析: 1.财务和仓库突然几乎同时发现他们的针式打印机都用不了了,打印没有任何提示和报错,可是打印机就是没有反应: 2.用我的笔记本试过 ...
- ORA-02391问题分析与解决
ORA-02391问题分析与解决 ORA-02391问题排查分析 查询用户 SESSION 配置 查看SESSION 状态 查看 SESSION状态涉及的服务器 查询1天 前变为 INACTIVE 状 ...
- 计算机培训工作坊主题研讨,问题分析与解决工作坊培训
课程大纲 第一讲:问题分析与解决之前--心智动力建设 一.团队打造的4C理论--打开心的工具 1. 真相猜猜猜 引导技术:团队链接与打开 2. 对话岛 引导技术:行动学习对话岛,角色表演,坦露心声 二 ...
- PHP date(); 日期和时间格式大全 PHP date(Y-m-d H:i:s); 获取当前时间 差8小时解决办法
用法: date(格式,[时间]);如果没有时间参数,则使用当前时间. 格式是一个字符串,其中以下字符有特殊意义:U 替换成从一个起始时间1970年1月1日以来的秒数<?php echo &qu ...
最新文章
- 【解决方案】MySQL-5.7.9 服务无法启动-“NET HELPMSG 3534”
- C# 操作http协议学习总结
- 设计模式之职责链模式永不罢休(二十一)
- python基础案例教程_python基础教程 10-11例子如何执行
- XML文件结构和基本语法
- 利用Excel VBA SQL做特殊文件浏览器
- 组合数学练习题(二)——Chemist
- 再论句子中单词的逆序输出
- addr2line排查地址
- 员工年终绩效考核表模板
- 思维模型篇:行业商业分析案例详解
- 判断空间上三个点是否共线问题【找bug篇】
- css 绘制圆形 扇形
- psn请验证您不是机器人_PS4无法登陆PSN的解决办法
- 20分钟掌握前端编写 CLI 工具
- 2021综述:计算机视觉中的注意力机制(续四):分支注意力
- 训练数据不够怎么造?yolo5 最有用的trick 之数据增强详解
- BUUCTF | [INSHack2017]sanity | [INSHack2019]INSAnity | [INSHack2019]Sanity | [INSHack2017]insanity-
- W5500在单片机中的测试及长字节的发送和接收
- 1125和855最小公倍数C语言,2016衢州省考行测数量关系送分题:最小公倍数和最大公约数...
热门文章
- mysql error unpacking_linux 安装 mysql rpm包出现error: unpacking of archive failed on file
- 在 Windows 10 中保存和恢复桌面图标位置的 2 个免费工具
- SpringBoot入门到精通 idea教学 (余胜军通俗易懂版本)
- 你为什么推荐java核心技术_读《java核心技术卷一》有感
- spring hateoas初体验
- 语义相似度的计算方法
- GICv3-4零散的寄存器解读(1)
- qt window release 打包的方法及常见问题,不同路径的差异
- qt学习(七)Sockt-TCP-UDP-BOARDCAST-MULI-CAST
- java 结束程序_如何优雅地停止Java进程