0

0

在Java中Calendar类常见方法有哪些_Java日期操作工具解析

P粉602998670

P粉602998670

发布时间:2026-03-06 03:25:20

|

667人浏览过

|

来源于php中文网

原创

java 8+ 应弃用 calendar,改用 java.time 包;因 calendar 月份从0开始、星期依赖设置、set()自动滚动、非线程安全、隐含时区/local,而 localdatetime、zoneddatetime 等更安全清晰。

在java中calendar类常见方法有哪些_java日期操作工具解析

Java 中 Calendar 类本身已不推荐直接使用,尤其在 Java 8+ 环境下,java.time 包(如 LocalDateTimeZonedDateTimePeriodDuration)才是现代、线程安全、语义清晰的首选。

为什么不该再用 Calendarget()set()

Calendar 的字段常量(如 Calendar.YEARCalendar.MONTH)设计反直觉:月份从 0 开始(0 == January),星期几依赖 setFirstDayOfWeek() 且默认是 Sunday(Calendar.SUNDAY == 1),容易导致偏移错误。

  • calendar.get(Calendar.MONTH) 返回 0 表示一月,但开发者常误当 1 处理,造成整月偏差
  • calendar.set(Calendar.DAY_OF_MONTH, 32) 不报错,而是自动“滚动”到下月,行为隐蔽
  • 非线程安全,多个线程共用同一 Calendar 实例会相互覆盖状态
  • 构造依赖 new GregorianCalendar(),隐含时区和 Locale 绑定,易引发跨环境时间不一致

Calendar.getInstance() 的替代写法(Java 8+)

获取当前时刻应优先用 Instant 或带时区的 ZonedDateTime,而非 Calendar.getInstance()

// ✅ 推荐:明确时区,不可变,语义清晰
ZonedDateTime now = ZonedDateTime.now(ZoneId.of("Asia/Shanghai"));

// ✅ 若只需本地日期时间(无时区语义)
LocalDateTime localNow = LocalDateTime.now();

// ❌ 避免:隐式使用系统默认时区 + 可变对象
Calendar cal = Calendar.getInstance(); // 时区、Locale 全部黑盒

注意:LocalDateTime 不代表真实时刻(缺少时区),仅适合业务逻辑中的“日历日期”,比如排班表;真实时间戳必须用 InstantZonedDateTime

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

Genspark
Genspark

Genspark 是一款创新的 AI 搜索引擎,致力于提供比传统搜索引擎更高效、准确和无偏见的信息获取方式。

下载

Calendar 做日期加减?改用 plusDays()plusMonths()

Calendar.add(int field, int amount) 同样存在字段歧义和边界滚动问题(例如对 1 月 31 日加一个月,可能得 3 月 3 日而非 2 月 28 日)。而 java.time 提供更自然的增量操作:

  • LocalDate.plusMonths(1) 默认“月末对齐”:1 月 31 日 → 2 月 28 日(闰年为 29 日)
  • LocalDate.plusDays(30) 是严格 30 天后,不含模糊语义
  • Period.between(start, end) 直接计算“几年几个月几天”,结果可读性强

若必须兼容旧代码中 Calendar,至少用 Calendar.toInstant() 转成 Instant 再操作,避免在 Calendar 上反复 add/roll

Calendar 迁移到 java.time 的关键转换点

老项目里常见 DateCalendar ↔ 字符串互转,迁移时需注意以下对应关系:

  • calendar.getTime()calendar.toInstant().atZone(ZoneId.systemDefault())
  • date.toInstant() → 直接调用,无需经 Calendar
  • SimpleDateFormat.parse(str) → 改用 DateTimeFormatter + LocalDateTime.parse(str, formatter)
  • calendar.get(Calendar.WEEK_OF_YEAR)localDate.get(IsoFields.WEEK_OF_WEEK_BASED_YEAR)(ISO 8601 标准周)

真正棘手的是遗留系统中混用 java.util.DateTimestamp 和数据库 JDBC 时间类型。这时建议在 DAO 层统一收口为 OffsetDateTimeInstant,避免在业务层反复做 Calendar 转换。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
java基础知识汇总
java基础知识汇总

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

1561

2023.10.24

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

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

324

2024.02.29

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

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

718

2023.08.03

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

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

219

2023.09.04

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

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

1561

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

647

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

1148

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

1122

2024.04.29

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号