讲师中心 微信公众号
AI工具推荐 视频效率加速

什么是Java中的Calendar类_旧版本日期处理工具的缺陷与常用方法

星敏小哥_9292

星敏小哥_9292

发布时间:2026-02-15 00:35:13

|

486人浏览过

|

来源于php中文网

原创

Calendar.getInstance() 返回当前JVM默认时区的实例,非UTC也非系统本地时区;其行为受JVM时区设置影响,易因环境差异引发线上问题。

什么是java中的calendar类_旧版本日期处理工具的缺陷与常用方法

Calendar.getInstance() 返回的到底是什么时区?

它默认返回当前 JVM 默认时区的实例,不是 UTC,也不是系统本地时区(如果 JVM 时区被显式设置过)。很多线上问题就出在这儿——本地开发环境和服务器时区不一致,Calendar.getInstance() 表现不同。

  • 查当前默认时区:TimeZone.getDefault().getID(),别靠猜
  • 要确定行为,显式传入时区:Calendar.getInstance(TimeZone.getTimeZone("Asia/Shanghai"))
  • 避免在容器环境(如 Docker)里依赖默认时区,镜像可能没设 TZ 环境变量,JVM 就 fallback 到 GMT

set() 和 add() 的行为差异经常被搞混

set() 是“覆盖”,add() 才是“相对偏移”。比如一个 Calendar 对象当前是 2023-01-31,调用 cal.set(Calendar.MONTH, 1)(即 2 月),结果不是 2023-02-31(不存在),而是自动滚到 2023-03-03;而 cal.add(Calendar.MONTH, 1) 才是真正加一个月,变成 2023-02-28(或 29)。

  • set() 后记得调用 cal.getTime() 前先 cal.complete(),否则字段可能未归一化(尤其跨月/年 set 后直接 get 某字段)
  • add() 支持负数,roll() 则只在本范围内滚动(比如对日期 roll(1) 不会进月)
  • 批量修改多个字段时,set() 多次不如用 set(year, month, date, ...) 构造器一次到位

Calendar 的线程安全性问题在哪儿?

Calendar 实例不是线程安全的。它的内部状态(比如 fields[]、isTimeSet)在 get()/set()/add() 过程中会被反复修改,多线程共用同一个实例,极易出现时间错乱或 ArrayIndexOutOfBoundsException(尤其在并发调用 getTime() 时触发内部计算)。

Java注释规范Skills
Java注释规范Skills

当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。

下载
  • 永远不要把 Calendar 当作静态工具类成员或 Spring bean 单例注入
  • 短生命周期场景下,每次用都 Calendar.getInstance() 新建——开销远小于排查并发 bug 的成本
  • 若真需复用,必须配合 synchronized 或 ThreadLocal<calendar></calendar>,但后者注意内存泄漏风险(尤其 Web 容器中未 remove)

为什么 new GregorianCalendar() 比 Calendar.getInstance() 更危险?

GregorianCalendar 是 Calendar 的具体子类,但直接 new GregorianCalendar() 会跳过父类的时区/语言环境初始化逻辑,且默认构造器使用的是 JVM 默认时区 + 默认 Locale,但某些 JDK 版本中它甚至不触发 complete(),导致首次 get() 出现未定义行为。

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

  • 一律用 Calendar.getInstance(),哪怕你要的是格里高利历——它返回的本来就是 GregorianCalendar 实例(JDK 7+)
  • 需要指定纪年方式(如日本和历)才考虑直接 new 子类,并传全参数:new GregorianCalendar(JapaneseChronology.INSTANCE, Locale.JAPAN)
  • 注意:Android 上部分低版本对 GregorianCalendar 构造器参数兼容性差,getInstance() 更稳
事情说清了就结束。Calendar 类的坑不在 API 多难记,而在它把「时区」「历法」「字段缓存」「线程模型」全揉在一个可变对象里——只要有一个环节没对齐,时间就悄悄偏了。

热门AI工具

更多
超级麦吉

一款通过数字员工协作完成调研、数据分析与文档制作的AI办公平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

2771

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

497

2026.01.26

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

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

1975

2024.02.29

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

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

4518

2023.08.10

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

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

1269

2025.12.24

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

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

423

2026.01.21

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

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

579

2026.01.21

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

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

429

2026.02.06

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

100

2026.10.28

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn