首页 > 其他分享 >关于Date使用不当的bug

关于Date使用不当的bug

时间:2023-04-02 21:23:23浏览次数:35  
标签:使用不当 beforeMinute Criteria Date new now bug before

关于Date使用不当的bug

1、背景

用户调用接口,传入一个参数分钟,表示想要查询距离现在多少分钟的记录。

有的时候会查不到记录。

2、排查过程

大致代码。

  • 获取当前的时间的date对象now,通过now的时间戳计算前beforeMinute的时间戳,转换成date对象
  • 查询 executeTime >= before && executeTime <= now && status == 1 的记录
	@GetMapping("/test")
    public void testMongo(Integer beforeMinute) {
        // 计算执行时间前后时间
        Date now = new Date(); // 获取当前时间的Date对象
        Date before = new Date(now.getTime() - beforeMinute * 60 * 1000); // 获取前beforeMinute的Date对象

        andCriteriaList.add(Criteria.where("executeTime").gte(before));
        andCriteriaList.add(Criteria.where("executeTime").lte(now));
        andCriteriaList.add(Criteria.where("status").is(Integer.parseInt("1"))); // 状态为 1
        Criteria combinedCriteria = new Criteria();
        combinedCriteria.andOperator(andCriteriaList.toArray(new Criteria[0]));
        Query query = new Query();
        query.addCriteria(combinedCriteria);
        List<AuditLogDownloadBean> list = mongoTemplate.find(query, AuditLogDownloadBean.class);
        for (AuditLogDownloadBean bean : list) {
            System.out.println(bean.getId() + " "+ bean.getExecuteTime() + " " + bean.getJobName());
        }
        return ;
    }

经过debug,问题出在构造before的date对象上,有时会出现before计算出来的时间戳会比now还要大,所以导致查不到数据。

Date before = new Date(now.getTime() - beforeMinute * 60 * 1000);
/**
	当查询三天前的记时,传入的参数=3x24x60=43200
	此时,beforeMinute * 60 * 1000 = 2,592,000,000 共十位,而int的最大值也是十位 2,147,483,647,所以产生了整型溢出,
	整个表达式的值相当于 now.getTime() - (-1702967296), 所以会比now还要大,最终导致查不到数据。
*/

// 改正 
Date before = new Date(now.getTime() - beforeMinute * 60L * 1000);

3、总结

  1. Java 中数字字面量默认是整型的
  2. 当一个表达式中含有变量时,要注意其是否可能产生整型溢出
  3. 当一个表达式中包含Long类型时,整个表达式的值会向Long转变

标签:使用不当,beforeMinute,Criteria,Date,new,now,bug,before
From: https://www.cnblogs.com/Sun-yuan/p/17281381.html

相关文章

  • Antd DatePicker 表单Value 转为 日期字符串格式
    AntdDatePicker表单Value转为日期字符串格式遇到问题:Antd4.x版本和5.x版本中DatePickervalue类型分别是:moment对象和dayjs对象类型,但通常提交表单时候,后端一般都要求是日期字符串格式“2022-08-09”这样;普遍的做法是在提交表单onFinish方法里对表单提交参数进......
  • QDateTime计算时间差
    QDateTime计算时间差fromPyQt5.QtCoreimportQDateTime#CreatetwoQDateTimeobjectsdt1=QDateTime.currentDateTime()dt2=QDateTime(2022,1,1,0,0)#Calculatethedifferenceinsecondsdiff_seconds=dt1.secsTo(dt2)print(f'Thedifferenceinse......
  • VC6 在win11下运行出现 LINK : fatal error LNK1168: cannot open Debug/test.exe for
    写在前面vc6下载地址:https://softdown01.rbread04.cn/down/VC6.0green.rar?timestamp=6429444b&auth_key=e4fc373a1342be9ce2d6802419980ade注意:如果是win11则记得修改msdev名字修改兼容性和管理员运行才行 问题:最近用vc6学习逆向的时候出现的,记录下,方便查阅:LINK:fatal......
  • Oracle 执行Update 或 select for update 是卡着
    原因和解决方法这种只有update无法执行其他语句可以执行的其实是因为记录锁导致的,在oracle中,执行了update或者insert语句后,都会要求commit,如果不commit却强制关闭连接,oracle就会将这条提交的记录锁住。通过执行下列语句查询当前卡着的会话SELECTs.sid,s.serial#FROMv$l......
  • 修改头像,CreateModelMixin, RetrieveModelMixin, UpdateModelMixin内部的方法进行重写
    1.假设GET请求和POST请求,用的序列化类不一样,如何处理__ser.py 2.假设GET请求和POST请求,用的序列化类不一样,如何处理__views.py  3.假设GET请求和POST请求,用的序列化类不一样,如何处理总结  4.用户注册测试  5.查询用户名和用户头像  6.修改用户头像  7......
  • Django笔记十三之select_for_update等选择和更新等相关操作
    本篇笔记将介绍update和create的一些其他用法,目录如下:get_or_createupdate_or_createselect_for_updatebulk_createbulk_update1、get_or_create前面我们介绍过get()和create()的用法,那么get_or_create()的意思很简单,就是获取或者创建,如果存在就返回,不存在就......
  • Keil5 打开 Debug ST-Link 卡死闪退
    点击Download烧录程序或者打开魔法棒DebugST-Link都出现了Keil5卡死闪退问题。确保目录是全英文;确保电脑上有ST-Link驱动;如果以上都没有问题,可能Keil5.38ST-Link的版本可能与你安装的驱动版本不一致。请重新安装ST-Link驱动程序,并替换Keil5.38根目录下的S......
  • Microsoft Child Process Debugging Power Tool 插件
    使用VisualStudio2022调试Dapr应用程序 使用Dapr编写的是一个多进程的程序,两个进程之间依赖于启动顺序来组成父子进程,使用VisualStudio调试起来可能会比较困难,因为VisualStudio默认只会把你当前设置的启动项目的启动调试。好在有VisualStudio扩展(MicrosoftC......
  • 使用vSphere Update Manager 升级 ESXi 主机
    使用vSphereUpdateManager升级ESXi主机vSphereUpdateManager vSphereUpdateManager 是用于升级、迁移、更新和修补群集主机、虚拟机和客户机操作系统的软件。 vSphereUpdateManager 可协调主机和虚拟机的升级。如果站点使用 vSphereUpdateManager,VMware建议......
  • SimpleDateFormat并发引发的multiple points 异常以及解决
    SimpleDateFormat并发引发的multiplepoints异常以及解决一、问题分析SimpleDateFormat并发会出现如下问题:1、java.lang.NumberFormatException:multiplepoints 2、 java.lang.NumberFormatException:emptyString 3、java.lang.NumberFormatException:Forinputs......