0

0

Java初级项目:如何实现一个万年历_日期算法与格式化

P粉602998670

P粉602998670

发布时间:2026-03-05 13:06:10

|

616人浏览过

|

来源于php中文网

原创

gregoriancalendar 日期计算易错因带时区、可变且隐式修正;应先 clear() 再 set(),或改用 localdate;simpledateformat 线程不安全,推荐 datetimeformatter;闰年判断须严格按格里高利历规则;农历节气需第三方库支持。

java初级项目:如何实现一个万年历_日期算法与格式化

为什么 GregorianCalendar 算日期总出错?

因为它是“带时区的可变日历”,不是纯数学日期计算器。你调 add()roll() 时,它会偷偷触发内部重计算(比如跨月时自动修正日期),而你没意识到当前 Calendar 实例还带着毫秒、时区、夏令时偏移这些干扰项。

  • 别用 new GregorianCalendar().set(2025, 1, 30) 初始化后直接算——2月没有30号,它会静默变成3月2日,但你完全看不到警告
  • 每次做日期运算前,先调 cal.clear() 清掉所有字段(包括毫秒、时区),再 set() 年月日,避免残留状态污染结果
  • 如果只做年月日层面的加减(比如“2024年12月+3个月”),优先用 LocalDate(Java 8+),它不带时区、不可变、行为确定

SimpleDateFormat 格式化万年历输出时线程不安全

它内部维护一个 calendar 字段和缓冲区,多线程共用同一个 SimpleDateFormat 实例时,format()parse() 会互相覆盖中间状态,导致输出乱码、日期跳变甚至 ArrayIndexOutOfBoundsException

  • 别在工具类里写 private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd")
  • 要么每次用都新建:new SimpleDateFormat("yyyy-MM-dd").format(date)(小项目够用)
  • 要么用 ThreadLocal 封装:private static final ThreadLocal<simpledateformat> TL_SDF = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd"))</simpledateformat>
  • Java 8+ 直接上 DateTimeFormatter——它是不可变且线程安全的,DateTimeFormatter.ofPattern("yyyy-MM-dd") 可以放心复用

闰年判断不能只看“能被4整除”

万年历要撑到公元9999年,必须严格按格里高利历规则:能被4整除但不能被100整除,或能被400整除。写成 year % 4 == 0 会在1900、2100年出错——这些年份不是闰年,但你的代码会当成闰年,二月返回29天。

Designs.ai
Designs.ai

AI设计工具

下载
  • 正确逻辑:(year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)
  • 别自己手写这个判断——LocalDate.of(year, 2, 29).isLeapYear() 更可靠,底层已处理所有边界
  • 如果还在用 Calendar,可以用 cal.getActualMaximum(Calendar.DAY_OF_MONTH) 拿2月最大天数,它内部已按闰年规则计算,比手动判断更少出错

显示农历/节气?Java 标准库根本不支持

java.timeCalendar 都只处理公历(阳历)。所谓“万年历”里的农历、二十四节气、干支纪年,是独立于公历的另一套天文算法,标准库没实现,也没打算加。

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

  • 别试图用 ChineseCalendar——那是 JDK 1.1 的遗留类,JDK 9 已移除,现在根本不存在
  • 需要农历转换,老实用第三方库,比如 lunardate(轻量)或 jchronic(功能全但较重)
  • 节气计算依赖太阳黄经,得用天文算法(如 VSOP87),简单查表只能覆盖有限年份,2000–2100 够用,但标“万年历”就容易翻车

真正麻烦的不是算某一天,而是把“年月日”映射到“星期、节气、农历日期、宜忌”这整套符号系统——每层都可能有例外规则,比如闰月怎么排、冬至必须在哪天、哪些年份要置闰。越想做得全,越得承认:标准库只管公历那一半。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

866

2023.07.31

python中的format是什么意思
python中的format是什么意思

python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

457

2024.06.27

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

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

324

2024.02.29

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

743

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

375

2025.12.24

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

27

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

27

2026.01.21

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

102

2026.02.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

4

2026.03.05

热门下载

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

精品课程

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

共23课时 | 4.1万人学习

C# 教程
C# 教程

共94课时 | 10.7万人学习

Java 教程
Java 教程

共578课时 | 77.3万人学习

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

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