基於時間偏差思路下的時間週期度量

2022-04-11 17:02:31 字數 2154 閱讀 5762

最近改專案中的bug,遇到一類問題:當月起始日可以設定的情況下(1日到28日),需要計算出對應的月、季度、年等相關的時間範圍,以及對應的如上月、上季、去年等,和給定時間戳的所屬年、季度、月份等各種時間求取。

為簡單起見,舉個栗子: 如如果月起始日設定成了5,那麼本月的時間範圍是:

2019.10.05 00:00:00 - 2019.11.04 23:59:59

複製**

本季度的時間範圍是:

2019.10.05 00:00:00 - 2020.01.04 23:59:59

複製**

專案中大量的地方需要用到此類計算。因此,相應的時間獲取被封裝成了工具類。這本身並沒有什麼問題,但問題在於封裝的工具類中每個時間週期的獲取寫法多種多樣,例如獲取上月起始時間,下個季度起始時間等等方法思路各不相同,加上不同的人都有去實現自己需要的方法,因此,整個工具類看下來,一是不好理解,二是各種潛藏的bug。

見得最多的,是判斷各種邊界情況,然後對應各種處理邏輯。。

有沒有簡單些的方法呢?

其實是有的。

無論月起始日設定成哪一天,在做月起始日相關的任何邏輯計算時,其實都可以採取一種通用的實現思路,即時間偏差的修正與回歸。例如,不管當前時間戳是多少,要計算本季度的起始時間,直接將時間戳先修正,然後計算出對應的自然時間概念下的季起始時間,最後再回補上對應的時間偏差即可。

talk is cheap. show me the code.

複製**

/**

* 根據月起始日,計算對應時間戳的季度開始時間

* * @param monthstart

* @param timestamp

* @return

*/public static long getfixedquarterbegintimebysetting(int monthstart, long timestamp)

/** * 根據月起始日,計算對應時間戳的季度結束時間

* * @param monthstart

* @param timestamp

* @return

*/public static long getfixedquarterendtimebysetting(int monthstart, long timestamp)

/** * 根據月起始日,計算對應時間戳的上個季度開始時間

* * @param monthstart

* @param timestamp

* @return

*/public static long getfixedlastquarterbegintimebysetting(int monthstart, long timestamp)

/** * 根據月起始日,計算對應時間戳的上個季度結束時間

* * @param monthstart

* @param timestamp

* @return

*/public static long getfixedlastquarterendtimebysetting(int monthstart, long timestamp)

/** * 根據月起始日,計算對應時間戳的年開始時間

* * @param monthstart

* @param timestamp

* @return

*/public static long getfixedyearbegintimebysetting(int monthstart, long timestamp)

複製**

很輕鬆的,我們將原本可能需要的複雜的時間範圍計算方式,統統基於同樣的思路,即時間偏差的修正與回歸,轉變成了求得修正後的時間戳後的自然時間週期,最後再回歸到最終想要的結果。

這樣乙個最明顯的好處是,整個工具類實現思路是完全一致的,且在求取時間週期時,一般情況下,也不會有什麼bug產生,理解了這種思路後,無論求月起始日對應的什麼時間週期,**實現也都很簡單。

月起始日引起的時間週期的變化,原因在於月起始日發生了變更。所謂解鈴還須繫鈴人,與其封裝形式和邏輯各樣,做各種邊界計算的處理,甚至弄不好還會出現各種莫名的bug。還不如將思路更多集中在月起始日本身,尋求更加通用的計算方式。

end~

時間複雜度分析 下

n表示陣列array的長度 int find int array,int n,int x return pos 時間複雜度為 o n 優化 n表示陣列array的長度 int find int array,int n,int x return pos 要查詢的變數 x 可能出現在陣列的任意位置,所以...

基於linux下獲取時間函式的詳解

asctime 將時間和日期以字串格式表示 include 定義函式 char asctime const struct tm timeptr 函式說明 asctime 將引數timeptr所指的tm結構中的資訊轉換成真實世界所使用的時間日期表示方法,然後將結果以字串形態返回。此函式已經由時區轉換成...

百度快照更新週期 百度收錄更新時間

星期二 假如前一天沒有更新文字作品的,今天趕快更新一下。由於明天會有小的更新,上公升還是降低很難說,但是一般情況下,收錄多了,排名也較簡易靠前。星期四 這一天是最緊張的.由於一般情況下,這一天的更新就決定了這一周的排名.星期三的混亂結果.一般今天就會 修正 這一天的更新,有的日期變化會很大.假如你的...