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,至于里边的参数没有去动,而结果证明这个方法才是真正能实现当前功能的,得到的结果也正是预想中的结果。

时间: 2024-10-01 20:15:58

calendar中set方法和静态属性带来的坑的相关文章

php父类中访问子类的静态属性

在类中,我们可以通过self访问本类或父类中的静态属性/静态方法,可以通过parent访问父类中的静态属性/静态方法. 可我们却没有关键字从父类中的方法访问子类的静态属性,这是由于父类是先于子类创建的,所以从逻辑上来讲从父类中访问子类的静态属性并不是一个好的选择. 但有些时候我们不得不这样做,那么我们可以通过get_class()方法实现: get_class()返回的是本对象名, get_class(obj)返回的是对象obj的名, 看下面这个例子: <?php class A {    fu

Python中私有方法和私有属性

1.私有方法和私有属性私有方法只能在类内部被调用,不能被对象使用私有属性只能在类内部使用,不能被对象使用 私有属性只能在类内部使用,对象不能使用,但是,我们可以通过在类内部定义公有方法对私有属性进行调用或修改,然后对象在调用这个公有方法使用.###私有属性和私有方法#########在属性名和方法名前面加上 __ class Person(object): def __init__(self): # 公有属性 self.name = "李四" #私有属性 self.__age = 18

C#如何静态调用C++中的方法(静态调用dll)

当我们想要在C#中使用C++项目的方法时,这个时候就可以通过调用C++项目的dll来实现,它有静态和动态调用两种方法. DLL(Dynamic Link Library)文件为动态链接库文件,又称“应用程序拓展”,是软件文件类型.在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中.当我们执行某一个程序时,相应的DLL文件就会被调用.一个应用程序可使用多个DLL文件,一个DLL文件也可能被不同的应用程序使用,这样的DLL文件

WPF中多窗口共享静态属性

由于我的DoubanFm在重新考虑之后,需要设置一个全局的CurrentSong,这个字段要让所有的VM都知道,而我同时又想把它作为我所有VM的共有属性.而且我想尽量减少代码的复制,提高重用.所以我做了以下的工作:(下面是我在WPF中的测试) 首先我们得熟悉MVVMlight框架 然后: (1)基类 一.抽象的VM的基类 abstract class MainViewModel : ViewModelBase 二.私有静态,公有非静态暴露,还有关键点:在属性更改之后用  RaisePropert

线程中锁方法和静态变量的锁

1-----锁方法的使用: final ServletContext ctx = request.getServletContext();这个地方变量要定义成常量: new Thread(){//写成了内部类 public void run() { AddCount.add(ctx); }; }.start(); class AddCount{ //用类模板当锁 public synchronized static void add(ServletContext ctx){------- syn

Objective-C - 动态方法、静态属性实例

设计"狗"类 /* 设计一个"狗"类 1> 属性 * 颜色 * 速度(单位是m/s) * 性别 * 体重(单位是kg) 2> 行为 * 吃:每吃一次,体重增加0.5kg,输出吃完后的体重 * 吠(叫):输出所有的属性 * 跑:每跑一次,体重减少0.5kg,输出速度和跑完后的体重 * 比较颜色:跟别的狗比较颜色,如果一样,返回YES,不一样,返回NO * 比较速度:跟别的狗比较速度,返回速度差(自己的速度 - 其他狗的速度) */ #import <

js中window对象的opener属性的一个坑

2018-05-08 17:48:33 今天我编写js代码时碰到了一个让我纠结了很久的小问题,在此记录一下当做笔记, 这个问题就是:在我自己写的子窗口中用opener属性却获取不到父窗口的window对象. 现在已经解决这个问题,请看下文 这是父窗口(windows.html)的代码: <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/lo

php中静态属性静态方法的用法

static关键字用来修饰属性.方法,称这些属性.方法为静态属性.静态方法.static关键字声明一个属性或方法是和类相关的,而不是和类的某个特定的实例相关,因此,这类属性或方法也称为“类属性”或“类方法”. 如果访问控制权限允许,可不必创建该类对象而直接使用类名加两个冒号“::”调用.static关键字可以用来修饰变量.方法.不需要经过实例化,就可以直接访问类中static的属性和static的方法.static 的属性和方法,只能访问static的属性和方法,不能类访问非静态的属性和方法.因

13 PHP 对象基础 属性 方法 静态属性方法 this self 构造方法 学习 析构方法

面向对象思想介绍 OOP:Object Oriented Program面向对象编程. 传统的面向过程 将要完成的工作,分作若干个步骤,或再细分为子步骤,然后后步骤从前往后一步一步完成,最初达致目标. 现代的面向对象 将要完成的工作拆分为"一个一个对象"的任务(功能),每个对象独自完成自己的任务,任务之间的链接通过"调用"来实现,最终也完成了整体的工作. 万事万物都是对象. 面向对象是设计思想的"升华"--面向过程是解决简单问题的自然的思维过程,