一、问题由来

前一天下午正在写代码的时候,领导突然走过来跟我说,让我去看一个神秘的BUG,说是在数据库中查询时的一个日期

返回到页面后,查询时间倒退了一天。一听到这个BUG,我就感觉很奇怪,还有这样的BUG?也让我满是期待,究竟是

什么样的BUG会导致这个问题呢?

二、问题分析

这就是一个很简单的列表查询,查询条件都只有一个怎么出现这么奇怪的BUG呢?我立马在本地测试了一下,结果还真是时间向前

倒退了一天。这个是查询的结果,

这个是使用Swagger测试的结果,

以0002这家企业为例,数据库查询的tableDate为2020-09-01,可是返回到页面中时却是2020-08-31,日期确实向前减了一天。

看到这个测试结果让我很惊讶,还真神了。这是时间发生错乱了嘛,还是发生时空穿梭了,问题竟然还真出现了。我去看了另外

一个查询,只查询年份的一个接口,结果更神奇,年份的查询结果为1970年。数据库查询结果如下,

页面中返回的结果为,

自己看到这结果都不得不相信这个现实。接着开始排查原因,查询年份的数据在返回页面前打印的数据为,

从打印的结果来看是正确的,没什么异常。可是查看第一个查询最后返回的数据时,发现有不对劲的地方,最后返回的是时间戳,而不是字符串的日期。

我将时间戳转换为日期后发现也是正确的,

接着进一步排查,看看这两个输出类中对应的日期字段是什么,

这两个返回的输出类中,日期字段都使用了java中的Date类型,并且使用了一个注解JsonFormat注解。这个注解是同事推介使用的,

使用这个注解的好处是,不需要在查询的SQL中对查询结果有日期、时间的字段做格式化处理,格式化日期和时间的操作全部放在Java

的输出类中来进行处理。这样对于我们开发来说,改动的代码量会小很多,不然不同的数据库比如Mysql和Oracle就需要使用不同的语法

进行格式化。对于开发来说,有复杂和简单的两种方法来解决问题,如果有得选,那么我一定会选择简单的办法来处理问题。

自己尝试使用各种办法,比如格式化日期时使用年月日时分秒,没有解决;输出类中使用字符串来接收查询的日期类型,可以解决。

到此可以确定一点就是格式化这里出问题了。

三、解决方案

和同事说了这个问题后,同事帮忙查询原因,最终找到一篇文章,找到了这个问题的解决办法。https://blog.csdn.net/a992795427/article/details/87094200

问题的原因是在使用JsonFormat这个注解时,使用的时区不一样,默认使用的是标准的格林威治时间,而我们中国所在的时区为东八区,需要在默认

时区上面加8个小时,记得这好像是初中的地理常识。在配置文件中添加上这一行配置之后,

spring.jackson.time-zone=GMT+8

问题解决。另外一个问题,只查询年份的时候,年份变为1970年的原因是使用JsonFormat注解格式化日期时,不能直接格式化为年份。这是通过实践

得出的经验。至此神秘BUG终于解决。

查询时间倒退一天-项目中惊现神秘BUG-JsonFormat使用采坑记的更多相关文章

  1. 我们自己写的solr查询的代码作为search项目中的dao

    我们自己写的solr查询的代码作为search项目中的dao,但是启动时会报错: 其实就是说 searchServiceImpl 中我们 Autowired 的 SearchDao 类 spring ...

  2. 动端逐渐出了许多的移动端的框架,比如Sencha Touch、JQTouch、Jquery-moblie、jqMobi等等。这些框架都有优缺点,不同的框架应用在不同的项目中。现简单阐述一下各框架的优缺点:

    移动前端工作的那些事---前端制作之微信小技巧篇   (2013-11-15 15:20) 转载▼ 标签: it css3/javascript html5 webapp 手机网站搭建 分类: 前端制 ...

  3. iOS dateformatter设置GMT格式时间--iOS开发系列---项目中成长的知识四

    今天在项目中开始接手客户端的签名这个模块,签名这个会在项目结束过后再单独写一下自己的心得! 今天讲讲在签名的过程中我们需要向服务器传送一个Date值,格式要求是格林威治时间,也就是GMT时间! 格式要 ...

  4. My97DatePicker时间控件在项目中的应用

    一.下载My97DatePicker的压缩包My97DatePicker.rar,解压. 注:My97DatePicker最新版本有开发包,项目中使用时删掉,以便节省空间,提高程序的运行效率. 二.在 ...

  5. 项目中容易出现的BUG预警

    之前没有记录BUG的习惯导致在同一个坑里边栽了好几次,于是将最近几个项目中遇到的问题整理一下,在进行新项目时预警一遍: 使用携带有搜索功能的分页查询时,注意当用户更改了查询条件但没有点击查询按钮直接点 ...

  6. 最近项目中使用Spring data jpa 踩过的坑

    最近在做一个有关OA项目中使用spring data JPA 操作数据库,结果遇到了补个不可思议的麻烦.困惑了好久. 首先看一下问题吧,这就是当时测试“设置角色时,需要首先删除该用户已经拥有的角色时” ...

  7. java使用elasticsearch分组进行聚合查询(group by)-项目中实际应用

    java连接elasticsearch 进行聚合查询进行相应操作 一:对单个字段进行分组求和 1.表结构图片: 根据任务id分组,分别统计出每个任务id下有多少个文字标题 .SQL:select id ...

  8. 项目中遇到的各种bug和踩过的坑

    zepto 赋值时单位转换问题 zepto 的 animate 方法移动某个元素的位置时,例如修改某个绝对定位的元素的 left 值,要与修改前的值单位一致,修改前如果是像素值,修改后也要是像素值,否 ...

  9. Notadd 2.0 全新 Node.js 版本~ (开发中) [从 PHP 到 node 的踩坑记]

    对于 Notadd 我们本来期望它实现更多... 尽管我们也尝试做了很多努力,但是由于 PHP 本身的局限,以及考虑到开发环境配置的复杂程度,最终使用了折中方案.接下来,我们谈谈整个技术选型历程,也供 ...

随机推荐

  1. 【xingorg1-ui】基于vue3.0从0-1搭建组件库(一)环境配置与目录规划

    npm地址 github源码 开篇-环境配置 环境配置: 使用vue-cli搭建项目框架,需要用vue3的话,得先把vue-cli的版本升级到vue-cli@5以上 npm install -g @v ...

  2. 用 Cloud Performance Test怎么录制测试脚本

    Cloud Performance Test 云压力测试平台(以下简称:CPT)可以提供一站式全链路云压力测试服务,通过分布式压力负载机,快速搭建系统高并发运行场景,按需模拟千万级用户实时访问,并结合 ...

  3. java字符串大小写转换的两种方法

    转载自:飞扬青春sina blogjava字符串大小写转换的两种方法 import java.io..* public class convertToPrintString {          pu ...

  4. nginx&http 第三章 ngx 请求处理的 11 个阶段 --ngx_http_process_request& ngx_http_handler

    ngx_http_process_request如果设置了定时器则删除,既然所有的请求已经接收完毕,就不会再发生超时了 重设连接的读写回调函数 重设请求读事件回调函数 调用 ngx_http_hand ...

  5. Ubuntu 12.10设置root用户登录图形界面

    Ubuntu 12.04默认是不允许root登录的,在登录窗口只能看到普通用户和访客登录.以普通身份登陆Ubuntu后我们需要做一些修改,普通用户登录后,修改系统配置文件需要切换到超级用户模式,在终端 ...

  6. SQL Server 批量生成数据库内多个表的表结构

    在遇到大型数据库的时候,一个数据库内存在大量的数据表,如果要生成多个表的表结构,一个表的检索,然后右键Create出来,太麻烦了. 下面我介绍下批量选择并生成多个表的表结构快捷方式,仅供参考. 第一步 ...

  7. Linux(centos6.8)配置Mysql环境

    1.下载mysql安装包 https://downloads.mysql.com/archives/community/ 2.查询mysql信息 [1]查询mysql是否已经安装 [root@plut ...

  8. a标签禁用

    a标签禁用可以使用CSS3的特性来控制 <a class="disabled">我是a标签</a> a.disabled { pointer-events: ...

  9. unity 顶点弹性网格效果

    1.球衰减 首先,我们将处理球衰减,鼠标或手指点中网格的点是碰撞点,越往外它所受的影响越小.我们需要从CPU中获取"_ImpactPos"这个碰撞点,获取摄像机和碰撞点的矢量,我们 ...

  10. Blazor入手教程(一)前言

    Blazor入手教程(一)前言 结论 最近在学习blazor.得出了这么一个结论: Blazor是一门很值得学习的技术,未来.net下将会有相当多的 web应用使用blazor开发.十分看好这一技术, ...