??作者簡介:Java領域優質創作者🏆,CSDN博客專家認證🏆
??技識訓,該賞
??點贊 👍 收藏 ?再看,養成習慣
Chronology 判斷是否閏年
判斷是否閏年是由年表Chronology 提供的,通常情況下,我們使用ISO下的年表,是IsoChronology ,
看下代碼實作
@Override
public boolean isLeapYear(long prolepticYear) {
return ((prolepticYear & 3) == 0) && ((prolepticYear % 100) != 0 || (prolepticYear % 400) == 0);
}
好精煉的代碼,值得我們研究研究
閏年的基本判定方法:
1、非整百年:能被4整除的為閏年,(如2004年就是閏年,2001年不是閏年)
2、整百年:能被400整除的是閏年,(如2000年是閏年,1900年不是閏年)
((prolepticYear & 3) == 0) && ((prolepticYear % 100) != 0 || (prolepticYear % 400) == 0);
這段代碼用了兩個條件,這兩個條件都符合,才是閏年,
- (prolepticYear & 3) == 0
- (prolepticYear % 100) != 0 || (prolepticYear % 400) == 0
(prolepticYear & 3) == 0 用了與運算子“&”,其使用規律如下:
兩個運算元中位都為1,結果才為1,否則結果為0,
3 的二進制是011 ,prolepticYear & 3 目的是保留最后2位二進制數,然后判斷是否最后兩位二進制數等于0,如果等于0,證明能被4整除,閏年一定要滿足是4的倍數的條件;
(prolepticYear % 100) != 0 || (prolepticYear % 400) == 0 這個就比較好理解了,看是不是100的倍數或者是不是400 倍數,
而且小虛竹發現java.time.Year#isLeap() 用的實作代碼邏輯是一樣的
public static boolean isLeap(long year) {
return ((year & 3) == 0) && ((year % 100) != 0 || (year % 400) == 0);
}
即使是巨佬寫的代碼,也存在代碼的復用性問題
上面IsoChronology 是對Chronology介面介面的isLeapYear實作,MinguoChronology等實作類的isLeapYear,互用了IsoChronology的isLeapYear方法,
//MinguoChronology
public boolean isLeapYear(long prolepticYear) {
return IsoChronology.INSTANCE.isLeapYear(prolepticYear + YEARS_DIFFERENCE);
}
巨佬是有考慮復用的,在MinguoChronology等實作類已經有復用了,
java.time.Year#isLeap() 的優先級高,因為它是靜態方法,isoChronology ** 可以引Year.isLeap**
Year ** 不可以引Chronology.isLeapYear** ,
博主發現在IsoChronology ** 的resolveYMD** 中已經存在了對Year.isLeap 的參考,

有的工具類會為了減少外部類依賴,重新寫一次底層方法,避免外部類(或是不在一個包底下)的類依賴,這個已經用了,說不過去 ,所以代碼是存在復用性問題的,
實戰
int year = 2020;
System.out.println(Year.isLeap(year));
System.out.println(IsoChronology.INSTANCE.isLeapYear(year));
LocalDate localDate = LocalDate.of(2021,9,7);
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDate.isLeapYear());
System.out.println(localDateTime.toLocalDate().isLeapYear());

今天是持續寫作的第 10 / 100 天,
可以關注我,點贊我、評論我、收藏我啦,
推薦相關文章
hutool日期時間系列文章
1DateUtil(時間工具類)-當前時間和當前時間戳
2DateUtil(時間工具類)-常用的時間型別Date,DateTime,Calendar和TemporalAccessor(LocalDateTime)轉換
3DateUtil(時間工具類)-獲取日期的各種內容
4DateUtil(時間工具類)-格式化時間
5DateUtil(時間工具類)-決議被格式化的時間
6DateUtil(時間工具類)-時間偏移量獲取
7DateUtil(時間工具類)-日期計算
8ChineseDate(農歷日期工具類)
9LocalDateTimeUtil(JDK8+中的{@link LocalDateTime} 工具類封裝)
10TemporalAccessorUtil{@link TemporalAccessor} 工具類封裝
其他
要探索JDK的核心底層原始碼,那必須掌握native用法
萬字博文教你搞懂java原始碼的日期和時間相關用法
java的SimpleDateFormat執行緒不安全出問題了,虛竹教你多種解決方案
原始碼分析:JDK獲取默認時區的風險和最佳實踐
高級JAVA開發必備技能:時區的規則發生變化時,如何同步JDK的時區規則
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/300462.html
標籤:java
