查询时间倒退一天-项目中惊现神秘BUG-JsonFormat使用采坑记
一、问题由来
前一天下午正在写代码的时候,领导突然走过来跟我说,让我去看一个神秘的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使用采坑记的更多相关文章
- 我们自己写的solr查询的代码作为search项目中的dao
我们自己写的solr查询的代码作为search项目中的dao,但是启动时会报错: 其实就是说 searchServiceImpl 中我们 Autowired 的 SearchDao 类 spring ...
- 动端逐渐出了许多的移动端的框架,比如Sencha Touch、JQTouch、Jquery-moblie、jqMobi等等。这些框架都有优缺点,不同的框架应用在不同的项目中。现简单阐述一下各框架的优缺点:
移动前端工作的那些事---前端制作之微信小技巧篇 (2013-11-15 15:20) 转载▼ 标签: it css3/javascript html5 webapp 手机网站搭建 分类: 前端制 ...
- iOS dateformatter设置GMT格式时间--iOS开发系列---项目中成长的知识四
今天在项目中开始接手客户端的签名这个模块,签名这个会在项目结束过后再单独写一下自己的心得! 今天讲讲在签名的过程中我们需要向服务器传送一个Date值,格式要求是格林威治时间,也就是GMT时间! 格式要 ...
- My97DatePicker时间控件在项目中的应用
一.下载My97DatePicker的压缩包My97DatePicker.rar,解压. 注:My97DatePicker最新版本有开发包,项目中使用时删掉,以便节省空间,提高程序的运行效率. 二.在 ...
- 项目中容易出现的BUG预警
之前没有记录BUG的习惯导致在同一个坑里边栽了好几次,于是将最近几个项目中遇到的问题整理一下,在进行新项目时预警一遍: 使用携带有搜索功能的分页查询时,注意当用户更改了查询条件但没有点击查询按钮直接点 ...
- 最近项目中使用Spring data jpa 踩过的坑
最近在做一个有关OA项目中使用spring data JPA 操作数据库,结果遇到了补个不可思议的麻烦.困惑了好久. 首先看一下问题吧,这就是当时测试“设置角色时,需要首先删除该用户已经拥有的角色时” ...
- java使用elasticsearch分组进行聚合查询(group by)-项目中实际应用
java连接elasticsearch 进行聚合查询进行相应操作 一:对单个字段进行分组求和 1.表结构图片: 根据任务id分组,分别统计出每个任务id下有多少个文字标题 .SQL:select id ...
- 项目中遇到的各种bug和踩过的坑
zepto 赋值时单位转换问题 zepto 的 animate 方法移动某个元素的位置时,例如修改某个绝对定位的元素的 left 值,要与修改前的值单位一致,修改前如果是像素值,修改后也要是像素值,否 ...
- Notadd 2.0 全新 Node.js 版本~ (开发中) [从 PHP 到 node 的踩坑记]
对于 Notadd 我们本来期望它实现更多... 尽管我们也尝试做了很多努力,但是由于 PHP 本身的局限,以及考虑到开发环境配置的复杂程度,最终使用了折中方案.接下来,我们谈谈整个技术选型历程,也供 ...
随机推荐
- CSS渐变中是如何定义渐变线的
在CSS语法中用户代理对渐变gradient语法的解析渲染离不开渐变线.渐变分为线性渐变(linear gradient)和径向渐变(radial gradient). 渐变在元素盒模型中backgr ...
- 案例:简易的Div拖拽
案例:简易的Div拖拽 鼠标移入Div区域后,按下鼠标左键,可以拖动Div移动;松开鼠标左键,Div拖动停止.同时要求Div不能拖出屏幕显示区域外. 拖拽原理:距离不变.三个事件(onmousedow ...
- RoekerMQ4.x可视化控制台安装
1.下载 https://github.com/apache/rocketmq-externals 2.解压文件tar -zxvf rocketmq-externals-master.zip 3.移动 ...
- Leetcode 1329. 将矩阵按对角线排序 题解
首先遍历对角线元素,顺序为: 先从第一列的最后一行到第一行 然后从第一行的第一列到最后一列 遍历的同时记录坐标和数值,对数值进行排序,然后坐标顺序放回. class Solution: def dia ...
- XSS(跨站脚本攻击) - 常用代码大全
XSS(跨站脚本攻击) - 常用代码大全-版本一 1'"()&%<acx><ScRiPt >prompt(915149)</ScRiPt> < ...
- 攻防世界-Web_php_include (四种解法)
攻防世界-Web_php_include (考察的是文件包含) 打开页面是这样一段代码从代码中得知page中带有php://的都会被替换成空 str_replace()以其他字符替换字符串中的一些 ...
- laravel 验证器使用
1.前后端不分离 (form表单提交) 控制器定义验证规则 <?php namespace App\Http\Controllers\Admin; use Illuminate\Http\Req ...
- 如何在Vegas中安装激活Continuum插件
视频剪辑插件Boris FX Continuum安装程序包含了多达250种插件.而视频剪辑软件Vegas Pro 18 Suite中提供了Boris FX Continuum Film Style U ...
- FL Studio钢琴卷轴之刷子工具以及其他
上一篇文章我们重点讲解了FL Studio钢琴卷轴的画笔工具,今天我们就来讲解钢琴卷轴窗口中剩下的工具.由于接下来的工具都很简单,所以我们将放在一起讲,现在就和小编一起来看看FL Studio钢琴卷轴 ...
- css3系列之box-sizing
box-sizing box-sizing: 俗称ie6 的混杂模式的盒子模型. 首先来了解一下 ie6 的混杂模式,和我们常用的 盒子模型有什么不一样 正常模式下: 我们设置的 width 和 ...