查询时间倒退一天-项目中惊现神秘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 本身的局限,以及考虑到开发环境配置的复杂程度,最终使用了折中方案.接下来,我们谈谈整个技术选型历程,也供 ...
随机推荐
- 实现一个简易vue
vue主要的功能实现主要分为3部分: 数据劫持/数据代理:数据改变时通知相关函数进行更新操作 数据依赖收集:建立保存dom节点与数据的关联关系 模板与数据之间的绑定:接受到新数据时对dom节点进行更新 ...
- 聊一聊sockmap 以及ebpf
之前聊过tcpdump 抓包原理,tcpdump使用packet 抓包,使用packet_map 完成零拷贝.但是这个零拷贝也有点假,何为假呢?从网卡到内存走的dma,哪能不能直接从dma拷贝到用户空 ...
- 字符串匹配算法之Sunday算法(转)
字符串匹配算法之Sunday算法 背景 我们第一次接触字符串匹配,想到的肯定是直接用2个循环来遍历,这样代码虽然简单,但时间复杂度却是Ω(m*n),也就是达到了字符串匹配效率的下限.于是后来人经过研究 ...
- Python_编码错误解决办法 python3 UnicodeEncodeError: 'gbk' codec can't encode character '\xXX' in position XX
先说解决办法:头部加几行代码 import io import sys sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='gb1803 ...
- [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1076)'))) - skipping
C:\Users>pip listPackage Version------------ -------behave 1.2.6configparser 3.7.4ddt 1.2.1parse ...
- [USACO14JAN]Ski Course Rating G
题目链接:https://www.luogu.com.cn/problem/P3101 Slove 这题我们可以尝试建立一个图. 以相邻的两个点建边,边的权值为两个点高度差的绝对值,然后把边按照边权值 ...
- 深度分析:面试阿里,字节跳动,美团90%被问到的List集合,看完还不懂算我输
1 List集合 1.1 List概述 在Collection中,List集合是有序的,可对其中每个元素的插入位置进行精确地控制,可以通过索引来访问元素,遍历元素. 在List集合中,我们常用到Arr ...
- 总结MathType安装的一些小技巧
MathType在编辑数学公式确实很方便,因为它的功能很强大,能够进行多种数学符号编辑.但是在安装时我们多多少少会遇到一些问题,那这些问题该怎么解决呢?下面就让小编来分享公式编辑器安装的一些小技巧吧! ...
- FL Studio中如何使用插件混杂功能中的琶音器
琶音指一串和弦音从低到高或从高到低依次连续奏出,可视为分解和弦的一种.通常作为一种专门的技巧训练用于练习曲中,有时作为短小的连接句或经过句出现在乐曲旋律声部中.在Trance类型电子音乐中,琶音的运用 ...
- 「LOJ 541」「LibreOJ NOIP Round #1」七曜圣贤
description 题面很长,这里给出题目链接 solution 用队列维护扔掉的红茶,同时若后扔出的红茶比先扔出的红茶编号更小,那么先扔出的红茶不可能成为答案,所以可以用单调队列维护 故每次询问 ...