0

0

Java里Date类和Calendar怎么用_Java旧版时间API说明

P粉602998670

P粉602998670

发布时间:2026-01-03 13:02:02

|

888人浏览过

|

来源于php中文网

原创

java中应弃用date和calendar,改用java 8的java.time包;date仅包装毫秒值且方法废弃易错,calendar笨重难用且时区处理不透明,而localdatetime、zoneddatetime等类型职责清晰、线程安全、api直观。

java里date类和calendar怎么用_java旧版时间api说明

Java里Date类为什么不能直接做日期计算

Date 类本质是毫秒时间戳的包装,它不提供年月日加减、获取星期几、计算两个日期差等能力。调用 date.getMonth()date.getYear() 这类方法不仅已废弃(自 JDK 1.1),而且返回值还带偏移(比如月份是 0~11,年份是距 1900 的偏移量),极易出错。

  • 不要用 date.setYear(2024) —— 实际设的是 2024 + 1900 = 3924 年
  • 不要用 date.getDate() 取“几号”——它叫 getDate(),但其实是取“日”(day of month),命名和语义严重脱节
  • 所有 getXXX()/setXXX() 方法在 JDK 1.1 就被标记为 @Deprecated,现代代码中应视为不可用

Calendar是Date的补丁,但用起来很重

Calendar 是为了弥补 Date 的缺陷而设计的,它支持时区、历法、字段增减等操作,但 API 设计笨重、线程不安全、易误用。

  • 必须用 Calendar.getInstance() 获取实例,不能 new Calendar()
  • 设置年月日要用 cal.set(Calendar.YEAR, 2024),不能直接 cal.setYear(2024)
  • 月份仍从 0 开始:cal.set(Calendar.MONTH, 0) 才是 1 月
  • 获取时间戳要手动调用 cal.getTime().getTime(),绕一圈回到 long
Calendar cal = Calendar.getInstance();
cal.set(2024, Calendar.JANUARY, 15); // 注意:JANUARY = 0
Date date = cal.getTime(); // 转回 Date,仅用于兼容老接口

旧API在跨时区或夏令时场景下容易翻车

Calendar 默认使用 JVM 启动时加载的时区,且对夏令时过渡日处理隐式、不透明。例如在“2023-10-29 凌晨 2:00 欧洲中部时间进入冬令时”那天,把时间设为 2023-10-29 02:30 可能被自动跳到 03:30,或者抛 IllegalArgumentException,取决于 cal.isLenient() 设置。

UXbot
UXbot

AI产品设计工具

下载
  • 默认 isLenient() == true:非法日期会被“纠正”,比如 2023-02-30 → 自动变成 2023-03-02
  • 设为 false 后,cal.set(2023, 1, 30) 会直接抛异常
  • 跨时区转换必须显式调用 cal.setTimeZone(TimeZone.getTimeZone("UTC")),且需注意 setTime()setTimeInMillis() 对时区的敏感性不同

现在该用什么替代

Java 8 引入的 java.time 包(JSR-310)才是正确答案:LocalDateTimeZonedDateTimePeriodDuration 等类型职责清晰、不可变、线程安全、API 直观。

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

  • 需要纯日期?用 LocalDate.of(2024, 1, 15)
  • 要带时区的时间?用 ZonedDateTime.now(ZoneId.of("Asia/Shanghai"))
  • 算两个日期差?用 Period.between(start, end)ChronoUnit.DAYS.between(d1, d2)
  • 和旧代码交互?用 date.toInstant().atZone(ZoneId.systemDefault()) 转换

真正棘手的不是“怎么用旧 API”,而是“怎么安全地从旧 API 迁移出来”——尤其当项目里大量存在 Date 字段、MyBatis 映射、JSON 序列化逻辑时,时区解释不一致是最隐蔽的坑。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

451

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

546

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

326

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

81

2025.09.10

mybatis一级缓存和二级缓存
mybatis一级缓存和二级缓存

在MyBatis中,一级缓存和二级缓存是两种不同级别的缓存机制,它们都可以用来提高性能。本专题提供mybatis一级缓存和二级缓存相关文章,大家可以免费阅读。

303

2023.08.21

ibatis和mybatis有什么区别
ibatis和mybatis有什么区别

ibatis和mybatis的区别:1、基本信息不同;2、开发时间不同;3、功能与易用性;4、配置文件;5、入参类型与出参类型;6、返回结果集接受方式;7、语法差异;8、数据库方言支持;9、插件支持;10、社区活跃度;11、全球化支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

93

2024.02.23

mybatis如何配置数据库连接
mybatis如何配置数据库连接

mybatis配置数据库连接的方法:1、指定数据源;2、配置事务管理器;3、配置类型处理器和映射器;4、使用环境元素;5、配置别名。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

106

2024.02.23

mybatis工作原理及流程是什么
mybatis工作原理及流程是什么

mybatis工作原理及流程:1、配置文件;2、接口与映射;3、sql解析与生成;4、执行计划;5、结果处理;6、动态sql;7、缓存机制;8、插件;9、事务管理;10、日志与监控;11、扩展性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

160

2024.02.23

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

48

2026.02.28

热门下载

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

精品课程

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

共23课时 | 4.1万人学习

C# 教程
C# 教程

共94课时 | 10.5万人学习

Java 教程
Java 教程

共578课时 | 75.5万人学习

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

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