❤️高级java开发必备技能❤️java8jsr-310判断是否闰年实现,发现原作者的代码可能有问题(java小虚竹,建议收藏)(代码片段)

小虚竹 小虚竹     2023-01-03     634

关键词:

❤️作者简介: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 的二进制是011prolepticYear & 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的时区规则

❤️高级java开发必备技能❤️java8新日期时间api(jsr-310:实战+源码分析),5万字详解(java小虚竹,建议收藏)(代码片段)

❤️作者简介:Java领域优质创作者🏆,CSDN博客专家认证🏆❤️技术活,该赏❤️点赞👍收藏⭐再看,养成习惯大家好,我是小虚竹。之前有粉丝私聊我,问能不能把JAVA8新的日期时间API(... 查看详情

❤️高级java开发必备技能❤️java8新日期时间api(jsr-310:常用计算工具),2万字详解(java小虚竹,建议收藏)(代码片段)

❤️作者简介:Java领域优质创作者🏆,博客专家认证🏆❤️技术活,该赏❤️点赞👍收藏⭐再看,养成习惯大家好,我是小虚竹。之前有粉丝私聊我,问能不能把JAVA8新的日期时间API(JSR-... 查看详情

❤️高级java开发必备技能❤️java8新日期时间api(jsr-310:格式化和解析),2万字详解(java小虚竹,建议收藏)(代码片段)

技术活,该赏点赞,收藏再看,养成习惯大家好,我是小虚竹。之前有粉丝私聊我,问能不能把JAVA8新的日期时间API(JSR-310)知识点梳理出来。答案是肯定的,谁让我宠粉呢。由于内容偏多(超... 查看详情

❤️《小黄鸭调试法》程序员必备技能!!!❤️

小黄鸭调试法场景一:我们都有过向别人(甚至可能向完全不会编程的人)提问及解释编程问题的经历,但是很多时候就在我们解释的过程中自己却想到了问题的解决方案,然后对方却一脸茫然。场景二:... 查看详情

高级java开发必备技能:java8新日期时间api(jsr-310:常用计算工具)(java小虚竹)(代码片段)

❤️作者简介:Java领域优质创作者🏆,博客专家认证🏆❤️技术活,该赏❤️点赞👍收藏⭐再看,养成习惯大家好,我是小虚竹。之前有粉丝私聊我,问能不能把JAVA8新的日期时间API(JSR-... 查看详情

高级java开发必备技能:java8新日期时间api(jsr-310:实战+源码分析)(java小虚竹)(代码片段)

❤️作者简介:Java领域优质创作者🏆,CSDN博客专家认证🏆❤️技术活,该赏❤️点赞👍收藏⭐再看,养成习惯大家好,我是小虚竹。之前有粉丝私聊我,问能不能把JAVA8新的日期时间API(... 查看详情

高级java程序员必备:《idea问题库》常见问题及解决方案,提升开发效率(java小虚竹)

❤️作者简介:大家好,我是小虚竹。Java领域优质创作者🏆,CSDN博客专家认证🏆,华为云享专家认证🏆❤️技术活,该赏❤️点赞👍收藏⭐再看,养成习惯IntellijIDEA使用教程相关系列目录问... 查看详情

❤️git开发必备❤️.gitignore详解!建议收藏(代码片段)

🎈作者:Linux猿🎈简介:CSDN博客专家🏆,C/C++、面试、刷题、算法尽管咨询我,关注我,有问题私聊!🎈关注专栏:Linux (优质好文持续更新中……)🚀目录一、为... 查看详情

高级java程序员必备:《idea问题库》常见问题及解决方案,提升开发效率2(java小虚竹)(代码片段)

❤️作者简介:大家好,我是小虚竹。Java领域优质创作者🏆,CSDN博客专家认证🏆,华为云享专家认证🏆❤️技术活,该赏❤️点赞👍收藏⭐再看,养成习惯IntellijIDEA使用教程相关系列目录问... 查看详情

体验一命通关-java技能树测评(代码片段)

写在前面:博主是一只经过实战开发历练后投身培训事业的“小山猪”,昵称取自动画片《狮子王》中的“彭彭”,总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、... 查看详情

体验一命通关-java技能树测评(代码片段)

写在前面:博主是一只经过实战开发历练后投身培训事业的“小山猪”,昵称取自动画片《狮子王》中的“彭彭”,总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、... 查看详情

java--☀️面试官:讲一下stringstringbuilder及stringbuffer区别?❤️‍⭐初学者面试必备⭐(代码片段)

哈喽,欢迎进来学习的小伙伴~【学习背景】本文会通过OpenJDK提供的Java性能测试工具JMH来测试下String、StringBuilder及StringBuffer拼接字符串的效率如何~关于JMH的介绍及具体使用,我的这篇博文中有介绍:Java–☀️面试官... 查看详情

高级java程序员必备:《idea问题库》常见问题及解决方案,提升开发效率4(java小虚竹)(代码片段)

❤️作者简介:大家好,我是小虚竹。Java领域优质创作者🏆,CSDN博客专家认证🏆,华为云享专家认证🏆❤️技术活,该赏❤️点赞👍收藏⭐再看,养成习惯IntellijIDEA使用教程相关系列目录问... 查看详情

高级java程序员必备:《idea问题库》常见问题及解决方案,提升开发效率4(java小虚竹)(代码片段)

❤️作者简介:大家好,我是小虚竹。Java领域优质创作者🏆,CSDN博客专家认证🏆,华为云享专家认证🏆❤️技术活,该赏❤️点赞👍收藏⭐再看,养成习惯IntellijIDEA使用教程相关系列目录问... 查看详情

高级java程序员必备:《idea问题库》常见问题及解决方案,提升开发效率4(java小虚竹)(代码片段)

❤️作者简介:大家好,我是小虚竹。Java领域优质创作者🏆,CSDN博客专家认证🏆,华为云享专家认证🏆❤️技术活,该赏❤️点赞👍收藏⭐再看,养成习惯IntellijIDEA使用教程相关系列目录问... 查看详情

❤️❤️❤️情人节必备,和女友一起玩新版飞机大战!万字只为你❤️❤️❤️收藏起来吧(代码片段)

🐲情人节必备,和女友一起玩新版飞机大战!本文目录:🐲情人节必备,和女友一起玩新版飞机大战!💦成果展示!💦应用知识💦游戏特色💦代码展示和说明🐹背景设定🐹敌... 查看详情

高级java程序员必备:《idea问题库》常见问题及解决方案,提升开发效率(java小虚竹)

❤️作者简介:大家好,我是小虚竹。Java领域优质创作者🏆,CSDN博客专家认证🏆,华为云享专家认证🏆❤️技术活,该赏❤️点赞👍收藏⭐再看,养成习惯IntellijIDEA使用教程相关系列目录问... 查看详情

java--❤️‍重新认识八种基本数据类型,以后入职不给公司大佬挖坑❤️‍初学者必备知识(代码片段)

❤️‍大家好,我是贾斯汀,欢迎进来学习啦~❤️‍【学习背景】相信很多初学Java的小伙伴或者已经入行的小伙伴,都知道Java的数据类型主要分为引用数据类型和基本数据类型,引用数据类型就是平时大家说的... 查看详情