0

0

Java基础项目如何实现万年历查询_闰年计算与基准日期偏移量算法

P粉602998670

P粉602998670

发布时间:2026-03-14 14:43:31

|

556人浏览过

|

来源于php中文网

原创

正确闰年判断逻辑是(year % 4 == 0 && year % 100 != 0) || (year % 400 == 0),需避开世纪年份仅%4的常见错误;基准日应选0001-01-01而非1970-01-01以支持万年历;动态获取月天数优于硬编码;用toEpochDay()数学偏移替代循环累加提升性能;须处理1582年儒略历到格里高利历跳变。

java基础项目如何实现万年历查询_闰年计算与基准日期偏移量算法

闰年判断别只用 % 4 == 0

Java里写 year % 4 == 0 判断闰年,上线后2100年会出错——它漏掉了世纪年份必须被400整除的规则。真实业务中,万年历要撑过几百年,不能靠“大概率正确”。

  • 正确逻辑是:(year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)
  • 别封装成单行三元表达式,可读性差还容易括号错位;直接写 if-return 更稳妥
  • 注意 LocalDate.isLeapYear() 是 JDK8+ 安全解法,但若项目还在用 JDK7 或需手动算天数偏移,就得自己实现

基准日期选 1970-01-01 还是 0001-01-01?

很多教程默认用 Unix 时间戳起点(1970-01-01)当基准,但万年历要查公元前或22世纪,这个起点太靠后,会导致大负数计算溢出或逻辑绕弯。

  • 推荐用 0001-01-01(ISO日历第1天)作基准:所有年份统一处理,无符号偏移量更直观
  • JDK8 的 LocalDate.toEpochDay() 内部就以 0001-01-01 为原点,返回 long 值(如 1970-01-01 对应 719163),直接复用最省事
  • 如果手写算法,得额外处理儒略历→格里高利历切换(1582年10月,跳10天),否则1500–1600年之间日期会偏1天

getDaysFromBase() 函数怎么避开月份天数硬编码

把12个月天数写死在数组里看似简单,但遇到闰年2月、跨世纪历法变更时,硬编码会变成bug温床。

  • YearMonth.of(year, month).lengthOfMonth() 动态获取天数,自动适配闰年,JDK8+
  • 如果必须手算:先累计前 month - 1 月天数,再加当月日数;其中2月天数由前述闰年函数决定
  • 避免用 Calendar.getActualMaximum(Calendar.DAY_OF_MONTH):它依赖系统默认时区和Locale,测试环境和生产环境可能不一致

查询性能卡在循环逐日累加?

有人为算某天是星期几,从基准日开始 while 循环加一天直到目标日——查2050年某天要循环上万次,响应直接超时。

闪念贝壳
闪念贝壳

闪念贝壳是一款AI 驱动的智能语音笔记,随时随地用语音记录你的每一个想法。

下载

立即学习Java免费学习笔记(深入)”;

  • 改用数学偏移:目标日 toEpochDay() - baseDay 得总天数差,再 % 7 就是星期偏移,O(1)
  • 注意 toEpochDay() 返回值范围是 -719162(0001-01-01)到 +719162(9999-12-31),long 完全够用
  • 如果输入是字符串如 "2025-03-12",先用 LocalDate.parse() 解析,别自己切分拼接,避免时区和格式歧义

闰年规则、基准选择、动态天数、数学偏移——这四点串起来才是稳的万年历底子。最容易被忽略的是历法断层:1582年10月4日后直接跳到10月15日,这段空档期如果没特殊标记,用户查10月10日会返回 null 或错误日期。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

254

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1089

2024.03.01

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

847

2023.08.22

while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

107

2023.09.25

java中calendar类的用法
java中calendar类的用法

Java Video类是JavaFX库中的一个类,用于创建和操作视频对象。它提供了方法来加载、播放、暂停、停止和控制视频的音量、速度和循环等属性。想了解更多Java中类的相关内容,可以阅读本专题下面的文章。

325

2024.02.29

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

761

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

221

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1570

2023.10.24

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

26

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.4万人学习

C# 教程
C# 教程

共94课时 | 11.3万人学习

Java 教程
Java 教程

共578课时 | 82.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号