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小时分析与解决,同时引出时间分析相关推荐

  1. Netty4.x: Server端 设置 option 警告 Unknown channel option ‘xxxx‘ for channel 分析及解决 (附源码分析)

    一.问题背景: 最近某springboot项目想嵌入一个用户聊天功能,打算使用 Rabbitmq + Netty4.x + Redis 来开发高性能聊天功能.花费三天时间所有功能都已实现.启动时却警告 ...

  2. mysql自动插入的时间不对 差8小时

    MySQL插入时间差八小时问题的解决方法 更新时间:2019年12月15日 10:19:12   转载 作者:lankeren 这篇文章主要给大家介绍了关于MySQL插入时间差八小时问题的解决方法,文 ...

  3. java-jvm-full gc频繁的分析及解决

    返回博客列表 转 关于施用full gc频繁的分析及解决 DEC_LIU 发布时间: 2013/10/13 20:32 阅读: 3431 收藏: 14 点赞: 1 评论: 1 关于应用full gc频 ...

  4. 运营分析:用七种维度来分析广告投放效果

    运营分析 随着互联网的飞速发展,各种网络产品应运而生,如电商网站,移动应用,视频媒体,新媒体等等.网络广告也成为了一种主要的广告形式.而网络广告的形式具有复杂和多样化的特点. 在网络营销中,运营人员经 ...

  5. 最小阻力之路,系统问题分析与解决八步法

    最小阻力之路,系统问题分析与解决八步法 时间:3day 课程背景 企业的管理者,都是解决问题的高手,而我们为什么却总是发现"今天"的问题来自"昨天"的解决方案, ...

  6. 针式打印机及微型打印机突然不能打印的问题分析和解决办法

    针式打印机及微型打印机突然不能打印的问题分析和解决办法 问题描述分析: 1.财务和仓库突然几乎同时发现他们的针式打印机都用不了了,打印没有任何提示和报错,可是打印机就是没有反应: 2.用我的笔记本试过 ...

  7. ORA-02391问题分析与解决

    ORA-02391问题分析与解决 ORA-02391问题排查分析 查询用户 SESSION 配置 查看SESSION 状态 查看 SESSION状态涉及的服务器 查询1天 前变为 INACTIVE 状 ...

  8. 计算机培训工作坊主题研讨,问题分析与解决工作坊培训

    课程大纲 第一讲:问题分析与解决之前--心智动力建设 一.团队打造的4C理论--打开心的工具 1. 真相猜猜猜 引导技术:团队链接与打开 2. 对话岛 引导技术:行动学习对话岛,角色表演,坦露心声 二 ...

  9. PHP date(); 日期和时间格式大全 PHP date(Y-m-d H:i:s); 获取当前时间 差8小时解决办法

    用法: date(格式,[时间]);如果没有时间参数,则使用当前时间. 格式是一个字符串,其中以下字符有特殊意义:U 替换成从一个起始时间1970年1月1日以来的秒数<?php echo &qu ...

最新文章

  1. 【解决方案】MySQL-5.7.9 服务无法启动-“NET HELPMSG 3534”
  2. C# 操作http协议学习总结
  3. 设计模式之职责链模式永不罢休(二十一)
  4. python基础案例教程_python基础教程 10-11例子如何执行
  5. XML文件结构和基本语法
  6. 利用Excel VBA SQL做特殊文件浏览器
  7. 组合数学练习题(二)——Chemist
  8. 再论句子中单词的逆序输出
  9. addr2line排查地址
  10. 员工年终绩效考核表模板
  11. 思维模型篇:行业商业分析案例详解
  12. 判断空间上三个点是否共线问题【找bug篇】
  13. css 绘制圆形 扇形
  14. psn请验证您不是机器人_PS4无法登陆PSN的解决办法
  15. 20分钟掌握前端编写 CLI 工具
  16. 2021综述:计算机视觉中的注意力机制(续四):分支注意力
  17. 训练数据不够怎么造?yolo5 最有用的trick 之数据增强详解
  18. BUUCTF | [INSHack2017]sanity | [INSHack2019]INSAnity | [INSHack2019]Sanity | [INSHack2017]insanity-
  19. W5500在单片机中的测试及长字节的发送和接收
  20. 1125和855最小公倍数C语言,2016衢州省考行测数量关系送分题:最小公倍数和最大公约数...

热门文章

  1. mysql error unpacking_linux 安装 mysql rpm包出现error: unpacking of archive failed on file
  2. 在 Windows 10 中保存和恢复桌面图标位置的 2 个免费工具
  3. SpringBoot入门到精通 idea教学 (余胜军通俗易懂版本)
  4. 你为什么推荐java核心技术_读《java核心技术卷一》有感
  5. spring hateoas初体验
  6. 语义相似度的计算方法
  7. GICv3-4零散的寄存器解读(1)
  8. qt window release 打包的方法及常见问题,不同路径的差异
  9. qt学习(七)Sockt-TCP-UDP-BOARDCAST-MULI-CAST
  10. java 结束程序_如何优雅地停止Java进程