Java開發(fā) 日期時間

2021-01-12 12:01 更新

\1. 【強制】日期格式化時,傳入 pattern 中表示年份統(tǒng)一使用小寫的 y。

說明:日期格式化時,yyyy 表示當(dāng)天所在的年,而大寫的 YYYY 代表是 week in which year(JDK7 之后引入的概念),意思是當(dāng)天所在的周屬于的年份,一周從周日開始,周六結(jié)束,只要本周跨年,返回的 YYYY 就是下一年。


正例:表示日期和時間的格式如下所示:
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")

\2. 【強制】在日期格式中分清楚大寫的 M 和小寫的 m,大寫的 H 和小寫的 h 分別指代的意義。

說明:日期格式中的這兩對字母表意如下:

? 1) 表示月份是大寫的 M;

? 2) 表示分鐘則是小寫的 m;

? 3) 24 小時制的是大寫的 H

? 4) 12 小時制的則是小寫的 h。

\3. 【強制】獲取當(dāng)前毫秒數(shù):System.currentTimeMillis(); 而不是 new Date().getTime()。

說明:如果想獲取更加精確的納秒級時間值,使用 System.nanoTime 的方式。在 JDK8 中,針對統(tǒng)計時間等場景,推薦使用 Instant 類。

\4. 【強制】不允許在程序任何地方中使用:

? 1)java.sql.Date。

? 2)java.sql.Time

? 3)java.sql.Timestamp。

說明:第 1 個不記錄時間,getHours()拋出異常;第 2 個不記錄日期,getYear()拋出異常;第 3 個在構(gòu)造方法 super((time/1000)*1000),在 Timestamp 屬性 fastTime 和 nanos 分別存儲秒和納秒信息。


反例: java.util.Date.after(Date)進(jìn)行時間比較時,當(dāng)入?yún)⑹?java.sql.Timestamp 時,會觸發(fā) JDK BUG(JDK9 已修復(fù)),可能導(dǎo)致比較時的意外結(jié)果。

\5. 【強制】不要在程序中寫死一年為 365 天,避免在公歷閏年時出現(xiàn)日期轉(zhuǎn)換錯誤或程序邏輯錯誤。

正例:
// 獲取今年的天數(shù)
int daysOfThisYear = LocalDate.now().lengthOfYear();
// 獲取指定某年的天數(shù)
LocalDate.of(2011, 1, 1).lengthOfYear();


反例:
// 第一種情況:在閏年 366 天時,出現(xiàn)數(shù)組越界異常
int[] dayArray = new int[365];
// 第二種情況:一年有效期的會員制,今年 1 月 26 日注冊,硬編碼 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)行傳參或比較。
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號