calendar中set方法和静态属性带来的坑

简介: 坑在哪里: 在我之前接触的一个项目中涉及到这么一项功能:每天00:00:00把某些数据移动到mongodb数据库的另一个集合中,也就是关系型数据库的表中。这个集合名是一个固定的名称加上当前的两个月前的日期所在的年和月份。 这个功能是在我接触这个项目之前就已经存在,也就是之前的同事实现的功能,写了一个java的定时任务。 那个同事如今已经不在我们公司了,但是最近却发现这个功
坑在哪里:

在我之前接触的一个项目中涉及到这么一项功能:每天00:00:00把某些数据移动到mongodb数据库的另一个集合中,也就是关系型数据库的表中。这个集合名是一个固定的名称加上当前的两个月前的日期所在的年和月份。

这个功能是在我接触这个项目之前就已经存在,也就是之前的同事实现的功能,写了一个java的定时任务。

那个同事如今已经不在我们公司了,但是最近却发现这个功能有些问题,数据的移动并不像预计那样,原本应该存在2月的数据却出现在了1月的表中。


坑的根源:

mongodb相关的问题暂时归我维护,这个问题也自然而然需要我来解决,于是便把他的代码翻出来看了一遍。结果便发现了问题出在了calendar的相关方法上。

要转移两个月前的数据,首先要获取两个月前的日期,他的生成表名的相关代码是这样的:
private String getDataCollectionName() {
       Calendar calendar = Calendar.getInstance();
       try {
            calendar.set(Calendar.DATE, -day);
            return "alarm_" + ToolUtils.dateToFormatStrDate(calendar.getTime(), "yyyy_MM");
        } catch (Exception e) {
        logger.error("{}: data transformating failed,{}", this.getClass().getName(), e.getMessage());
        }
       return null;
 }

问题正是出在calendar的set方法上,包括后来的查询数据使用的开始和结束时间,也一样用的是 calendar.set(Calendar.DATE, -day);

这个方法乍一看起来似乎就是设置日期为当前日期减去指定的天数, 但是实际上结果并不是想象中的这样得到两个月前的日期(这里的day它定义的是60,也就是两个月)。


填坑:

找到原因之后,我把这个方法进行了替换,把set改为了add,至于里边的参数没有去动,而结果证明这个方法才是真正能实现当前功能的,得到的结果也正是预想中的结果。

当然了,也可以不改方法的同时把参数略做改变,如 calendar.set(Calendar.DATE, calendar.get(calendar.DATE)-day);
目录
相关文章
|
2月前
|
存储 算法 Java
解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用
在Java中,Set接口以其独特的“无重复”特性脱颖而出。本文通过解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用。
46 3
|
16天前
|
Java Windows
IDEA不使用lombok,如何快速生成get和set方法
【11月更文挑战第10天】在 IntelliJ IDEA 中生成 `get` 和 `set` 方法有多种方式:通过菜单操作、使用快捷键或自定义模板。菜单操作包括选择“Code”菜单中的“Generate...”,快捷键为“Alt + Insert”。自定义模板可在“File”->“Settings”->“Editor”->“Code Style”->“Java”中设置。批量生成时,可多选变量一次性生成。
|
2月前
|
Rust Java
set 方法是坏味道?
【10月更文挑战第19天】
28 5
idea按住alt + insert 没有出现get和set方法怎样解决
idea按住alt + insert 没有出现get和set方法怎样解决
|
2月前
|
存储
ES6中的Set数据结构的常用方法和使用场景
ES6中的Set数据结构的常用方法和使用场景
|
3月前
|
JavaScript 前端开发
JavaScript 中的新 Set 方法
JavaScript 中的新 Set 方法
26 1
|
4月前
|
Python
python中set和frozenset方法和区别
python中set和frozenset方法和区别
|
5月前
|
NoSQL Java Redis
Redis16-RedisTemplate快速入门,max -idle,min-idle,max-wait,用set的方法,opsForValue().set的方法
Redis16-RedisTemplate快速入门,max -idle,min-idle,max-wait,用set的方法,opsForValue().set的方法
TypeError: Cannot set properties of undefined (setting ‘resdata‘),res定义数据出现的问题,定义的方法用this换成that
TypeError: Cannot set properties of undefined (setting ‘resdata‘),res定义数据出现的问题,定义的方法用this换成that
|
5月前
|
索引
ArrayList集合常用方法,.set可以用来生成图片和赋值命名,array.remove(1),array.set(1,“xxxx”)可以修改指定位置,array.size可以获取元素的个数
ArrayList集合常用方法,.set可以用来生成图片和赋值命名,array.remove(1),array.set(1,“xxxx”)可以修改指定位置,array.size可以获取元素的个数