查询时间倒退一天-项目中惊现神秘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 本身的局限,以及考虑到开发环境配置的复杂程度,最终使用了折中方案.接下来,我们谈谈整个技术选型历程,也供 ...
随机推荐
- 【xingorg1-ui】基于vue3.0从0-1搭建组件库(一)环境配置与目录规划
npm地址 github源码 开篇-环境配置 环境配置: 使用vue-cli搭建项目框架,需要用vue3的话,得先把vue-cli的版本升级到vue-cli@5以上 npm install -g @v ...
- 用 Cloud Performance Test怎么录制测试脚本
Cloud Performance Test 云压力测试平台(以下简称:CPT)可以提供一站式全链路云压力测试服务,通过分布式压力负载机,快速搭建系统高并发运行场景,按需模拟千万级用户实时访问,并结合 ...
- java字符串大小写转换的两种方法
转载自:飞扬青春sina blogjava字符串大小写转换的两种方法 import java.io..* public class convertToPrintString { pu ...
- nginx&http 第三章 ngx 请求处理的 11 个阶段 --ngx_http_process_request& ngx_http_handler
ngx_http_process_request如果设置了定时器则删除,既然所有的请求已经接收完毕,就不会再发生超时了 重设连接的读写回调函数 重设请求读事件回调函数 调用 ngx_http_hand ...
- Ubuntu 12.10设置root用户登录图形界面
Ubuntu 12.04默认是不允许root登录的,在登录窗口只能看到普通用户和访客登录.以普通身份登陆Ubuntu后我们需要做一些修改,普通用户登录后,修改系统配置文件需要切换到超级用户模式,在终端 ...
- SQL Server 批量生成数据库内多个表的表结构
在遇到大型数据库的时候,一个数据库内存在大量的数据表,如果要生成多个表的表结构,一个表的检索,然后右键Create出来,太麻烦了. 下面我介绍下批量选择并生成多个表的表结构快捷方式,仅供参考. 第一步 ...
- Linux(centos6.8)配置Mysql环境
1.下载mysql安装包 https://downloads.mysql.com/archives/community/ 2.查询mysql信息 [1]查询mysql是否已经安装 [root@plut ...
- a标签禁用
a标签禁用可以使用CSS3的特性来控制 <a class="disabled">我是a标签</a> a.disabled { pointer-events: ...
- unity 顶点弹性网格效果
1.球衰减 首先,我们将处理球衰减,鼠标或手指点中网格的点是碰撞点,越往外它所受的影响越小.我们需要从CPU中获取"_ImpactPos"这个碰撞点,获取摄像机和碰撞点的矢量,我们 ...
- Blazor入手教程(一)前言
Blazor入手教程(一)前言 结论 最近在学习blazor.得出了这么一个结论: Blazor是一门很值得学习的技术,未来.net下将会有相当多的 web应用使用blazor开发.十分看好这一技术, ...