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

坑在哪里:
 
在我之前接触的一个项目中涉及到这么一项功能:每天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);
是的,Calendar 是 Java 用于操作日期和时间的类,提供了丰富的方法属性来获取和设置日期时间信息,可以用于许多日期时间相关的场景。 使用 Calendar 类需要进行如下步骤: 1. 使用静态方法 getInstance() 获取 Calendar 实例。 2. 使用 Calendar方法来设置日期时间信息,例如 set() 方法设置年、月、日等。 3. 使用 Calendar 的 get() 方法获取日期时间信息,例如 get(Calendar.YEAR) 获取年份。 4. 使用 Calendaradd() 方法进行日期时间计算,例如 add(Calendar.DAY_OF_MONTH, 1) 将日期加 1 天。 5. 使用 Calendar 的 getTime() 方法Calendar 对象转换为 Date 对象,或者使用 setTime() 方法将 Date 对象转换为 Calendar 对象。 下面是一个使用 Calendar 类的简单示例: ```java import java.util.Calendar; public class CalendarExample { public static void main(String[] args) { // 获取 Calendar 实例 Calendar cal = Calendar.getInstance(); // 设置日期时间信息 cal.set(Calendar.YEAR, 2022); cal.set(Calendar.MONTH, Calendar.JANUARY); cal.set(Calendar.DAY_OF_MONTH, 1); cal.set(Calendar.HOUR_OF_DAY, 0); cal.set(Calendar.MINUTE, 0); cal.set(Calendar.SECOND, 0); // 获取日期时间信息 int year = cal.get(Calendar.YEAR); int month = cal.get(Calendar.MONTH); int dayOfMonth = cal.get(Calendar.DAY_OF_MONTH); int hourOfDay = cal.get(Calendar.HOUR_OF_DAY); int minute = cal.get(Calendar.MINUTE); int second = cal.get(Calendar.SECOND); // 输出日期时间信息 System.out.println(year + "-" + (month + 1) + "-" + dayOfMonth + " " + hourOfDay + ":" + minute + ":" + second); // 进行日期时间计算 cal.add(Calendar.DAY_OF_MONTH, 1); // 转换为 Date 对象 Date date = cal.getTime(); System.out.println(date); } } ``` 上述示例,我们创建了一个 Calendar 实例,并设置了日期时间信息。然后,使用 get() 方法获取日期时间信息,并输出到控制台。最后,使用 add() 方法进行日期时间计算,并将 Calendar 对象转换为 Date 对象。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值