坑在哪裡:
在我之前接觸的一個項目中涉及到這麼一項功能:每天00:00:00把某些資料移動到mongodb資料庫的另一個集合中,也就是關系型資料庫的表中。這個集合名是一個固定的名稱加上目前的兩個月前的日期所在的年和月份。
這個功能是在我接觸這個項目之前就已經存在,也就是之前的同僚實作的功能,寫了一個java的定時任務。
那個同僚如今已經不在我們公司了,但是最近卻發現這個功能有些問題,資料的移動并不像預計那樣,原本應該存在2月的資料卻出現在了1月的表中。
坑的根源:
mongodb相關的問題暫時歸我維護,這個問題也自然而然需要我來解決,于是便把他的代碼翻出來看了一遍。結果便發現了問題出在了calendar的相關方法上。
要轉移兩個月前的資料,首先要擷取兩個月前的日期,他的生成表名的相關代碼是這樣的:
問題正是出在calendar的set方法上,包括後來的查詢資料使用的開始和結束時間,也一樣用的是calendar.set(calendar.date, -day);
這個方法乍一看起來似乎就是設定日期為目前日期減去指定的天數,但是實際上結果并不是想象中的這樣得到兩個月前的日期(這裡的day它定義的是60,也就是兩個月)。
填坑:
找到原因之後,我把這個方法進行了替換,把set改為了add,至于裡邊的參數沒有去動,而結果證明這個方法才是真正能實作目前功能的,得到的結果也正是預想中的結果。
當然了,也可以不改方法的同時把參數略做改變,如calendar.set(calendar.date, calendar.get(calendar.date)-day);