\1. 【強(qiáng)制】日期格式化時(shí),傳入 pattern
中表示年份統(tǒng)一使用小寫的 y
。
說明:日期格式化時(shí),yyyy 表示當(dāng)天所在的年,而大寫的 YYYY 代表是 week in which year(JDK7 之后引入的概念),意思是當(dāng)天所在的周屬于的年份,一周從周日開始,周六結(jié)束,只要本周跨年,返回的 YYYY 就是下一年。
正例:表示日期和時(shí)間的格式如下所示:
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
\2. 【強(qiáng)制】在日期格式中分清楚大寫的 M
和小寫的 m
,大寫的 H
和小寫的 h
分別指代的意義。
說明:日期格式中的這兩對(duì)字母表意如下:
? 1) 表示月份是大寫的 M
;
? 2) 表示分鐘則是小寫的 m
;
? 3) 24 小時(shí)制的是大寫的 H
;
? 4) 12 小時(shí)制的則是小寫的 h
。
\3. 【強(qiáng)制】獲取當(dāng)前毫秒數(shù):System.currentTimeMillis()
; 而不是 new Date().getTime()
。
說明:如果想獲取更加精確的納秒級(jí)時(shí)間值,使用 System.nanoTime 的方式。在 JDK8 中,針對(duì)統(tǒng)計(jì)時(shí)間等場(chǎng)景,推薦使用 Instant 類。
\4. 【強(qiáng)制】不允許在程序任何地方中使用:
? 1)java.sql.Date
。
? 2)java.sql.Time
。
? 3)java.sql.Timestamp
。
說明:第 1 個(gè)不記錄時(shí)間,getHours()拋出異常;第 2 個(gè)不記錄日期,getYear()拋出異常;第 3 個(gè)在構(gòu)造方法 super((time/1000)*1000),在 Timestamp 屬性 fastTime 和 nanos 分別存儲(chǔ)秒和納秒信息。
反例: java.util.Date.after(Date)進(jìn)行時(shí)間比較時(shí),當(dāng)入?yún)⑹?java.sql.Timestamp 時(shí),會(huì)觸發(fā) JDK BUG(JDK9 已修復(fù)),可能導(dǎo)致比較時(shí)的意外結(jié)果。
\5. 【強(qiáng)制】不要在程序中寫死一年為 365 天,避免在公歷閏年時(shí)出現(xiàn)日期轉(zhuǎn)換錯(cuò)誤或程序邏輯錯(cuò)誤。
正例:
// 獲取今年的天數(shù)
int daysOfThisYear = LocalDate.now().lengthOfYear();
// 獲取指定某年的天數(shù)
LocalDate.of(2011, 1, 1).lengthOfYear();
反例:
// 第一種情況:在閏年 366 天時(shí),出現(xiàn)數(shù)組越界異常
int[] dayArray = new int[365];
// 第二種情況:一年有效期的會(huì)員制,今年 1 月 26 日注冊(cè),硬編碼 365 返回的卻是 1 月 25 日
Calendar calendar = Calendar.getInstance();
calendar.set(2020, 1, 26);
calendar.add(Calendar.DATE, 365);
\6. 【推薦】避免公歷閏年 2 月問題。閏年的 2 月份有 29 天,一年后的那一天不可能是 2 月 29日。
\7. 【推薦】使用枚舉值來指代月份。如果使用數(shù)字,注意 Date
,Calendar
等日期相關(guān)類的月份 month
取值在 0-11
之間。
說明:參考 JDK 原生注釋,Month value is 0-based. e.g., 0 for January.
正例: Calendar.JANUARY,Calendar.FEBRUARY,Calendar.MARCH 等來指代相應(yīng)月份來進(jìn)行傳參或比較。
更多建議: