Java開發(fā) 日期時(shí)間

2021-01-12 12:01 更新

\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)行傳參或比較。
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)