news 2026/9/13 20:16:42

Java处理时间-java.time

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java处理时间-java.time

在 Java 中,处理日期和时间的类经历了重大演进。根据你使用的 Java 版本不同,推荐使用不同的 API。以下是全面、清晰、现代的 Java 时间处理类总结(截至 Java 21):


✅ 推荐:Java 8+ 使用java.time包(JSR-310)—— 现代、线程安全、易用

这是目前最推荐的方式,设计优秀,避免了旧 API 的诸多坑。

核心类概览

用途示例
LocalDateTime不带时区的日期+时间(如:2026-02-09T17:30:45)业务日志、本地事件
LocalDate仅日期(如:2026-02-09)生日、节假日
LocalTime仅时间(如:17:30:45)营业时间、闹钟
ZonedDateTime带时区的完整时间(如:2026-02-09T17:30:45+08:00[Asia/Shanghai])全球应用、跨时区调度
Instant时间戳(UTC,从 1970-01-01T00:00:00Z 开始的纳秒数)系统日志、数据库存储
Duration两个时间点之间的时间量(如:2 小时 30 分)计时、间隔
Period两个日期之间的日期量(如:1 年 2 个月)年龄、合同周期
DateTimeFormatter格式化与解析(替代SimpleDateFormat"yyyy-MM-dd HH:mm:ss"

📌 常用示例(Java 8+)

importjava.time.*;importjava.time.format.DateTimeFormatter;publicclassModernTimeExample{publicstaticvoidmain(String[]args){// 1. 获取当前时间(系统默认时区)LocalDateTimenow=LocalDateTime.now();LocalDatetoday=LocalDate.now();ZonedDateTimezonedNow=ZonedDateTime.now();// 带时区// 2. 创建指定时间LocalDateTimedt=LocalDateTime.of(2026,2,9,17,30,45);LocalDatedate=LocalDate.of(2026,Month.FEBRUARY,9);// 3. 格式化输出DateTimeFormatterformatter=DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");System.out.println(now.format(formatter));// 2026-02-09 17:30:45// 4. 解析字符串LocalDateTimeparsed=LocalDateTime.parse("2026-02-09 17:30:45",formatter);// 5. 加减操作(不可变,返回新对象)LocalDateTimetomorrow=now.plusDays(1);LocalDateTimeoneHourAgo=now.minusHours(1);// 6. 转为时间戳(用于数据库或网络传输)Instantinstant=now.atZone(ZoneId.systemDefault()).toInstant();longepochMilli=instant.toEpochMilli();// 毫秒时间戳// 7. 从时间戳创建LocalDateTimefromTs=LocalDateTime.ofInstant(Instant.ofEpochMilli(epochMilli),ZoneId.systemDefault());}}

✅ 优点:不可变、线程安全、API 清晰、无夏令时陷阱(合理处理)


⚠️ 旧版 API(Java 8 之前)——不推荐新项目使用

这些类存在设计缺陷(非线程安全、月份从 0 开始、可变等),但你可能在老代码中见到。

问题替代方案
java.util.Date表示时间戳,但命名误导(实际包含时间),可变,非线程安全InstantLocalDateTime
java.util.Calendar复杂、月份从 0 开始(Jan=0)、可变、非线程安全LocalDateTime/ZonedDateTime
java.text.SimpleDateFormat非线程安全!格式化性能差DateTimeFormatter

❌ 旧 API 示例(仅作对比)

// 危险!SimpleDateFormat 非线程安全SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-dd HH:mm:ss");Datedate=sdf.parse("2026-02-09 17:30:45");// 注意:月份不用减1?其实这里字符串解析没问题,但构造 Date 时 Calendar.MONTH 从0开始!// Calendar 月份从0开始(反人类)Calendarcal=Calendar.getInstance();cal.set(2026,Calendar.FEBRUARY,9);// 正确(因为 Calendar.FEBRUARY = 1)// cal.set(2026, 1, 9); // 也是2月,但容易混淆

🔁 新旧 API 互转(兼容老系统)

// Date → Instant → LocalDateTimeDateoldDate=newDate();Instantinstant=oldDate.toInstant();LocalDateTimeldt=LocalDateTime.ofInstant(instant,ZoneId.systemDefault());// LocalDateTime → DateLocalDateTimeldt=LocalDateTime.now();DatenewDate=Date.from(ldt.atZone(ZoneId.systemDefault()).toInstant());

📌 最佳实践建议

  1. 新项目一律使用java.time(JSR-310)
  2. 永远不要在多线程环境中共享SimpleDateFormat
  3. 存储时间戳到数据库时,优先用Instant(UTC)或long毫秒值
  4. 显示给用户时,再根据其时区格式化(如ZonedDateTime
  5. 避免使用System.currentTimeMillis()做业务逻辑,改用Instant.now()

🧩 补充:第三方库(通常不需要)

  • Joda-Timejava.time的前身,Java 8 后官方已吸收其优点,无需再引入
  • ThreeTenBP:Android 或 Java 6/7 项目可使用(Backport of JSR-310)

总结

场景推荐类
本地日期时间(无时区)LocalDateTime
仅日期LocalDate
带时区的时间ZonedDateTime
时间戳(系统/数据库)Instant
格式化/解析DateTimeFormatter
时间间隔Duration(时分秒)、Period(年月日)

💡记住:Java 8 的java.time是处理时间的终极答案,简洁、安全、强大。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/11 22:39:19

大数据面试必问:Doris 核心原理与高频考点解析

大数据面试必问:Doris 核心原理与高频考点解析关键词:Doris数据库、MPP架构、列式存储、预聚合、面试高频考点、数据模型、性能调优摘要:本文深度解析大数据领域明星数据库 Doris 的核心原理,结合面试高频考点,通过生活…

作者头像 李华
网站建设 2026/8/25 13:28:46

▲4FSK调制解调+扩频解扩通信链路matlab误码率仿真

目录 1.本系统整体构架 2.各个模块基本原理 2.1 4FSK 调制原理 2.4 FSK解调原理 2.4.1 相干解调 2.4.2 非相干解调 2.3 扩频技术原理 3.仿真结果 4.完整程序下载 1.本系统整体构架 整个程序,我们采用如下的流程图实现: 2.各个模块基本原理 2.…

作者头像 李华
网站建设 2026/9/4 16:50:42

LangChain构建测试用例Agent实战

一. 概述 本文是一份Langchain 1.0从环境搭建到实战演示的入门指南,面向想用 LangChain 1.0 构建软件测试相关Agent的测开人员。内容覆盖三大块:环境准备(包括 IDE、Conda、API Key、依赖等)以及实战示例,最终构建一个测试用例生成智能体。整份文档以实践为导向,配有完整…

作者头像 李华
网站建设 2026/9/7 3:05:05

2026年AI大模型入门指南:收藏这份学习资料,小白也能成为数字伙伴!

2025年已成为AI Agent发展的关键年份。随着技术的成熟和应用场景的拓展,AI智能体正从简单的聊天机器人进化成为能够真正理解、规划并执行复杂任务的数字伙伴。今天我们就来盘点一下当前热门的AI Agent方向和未来趋势。一、记忆型Agent:突破“金鱼记忆”瓶…

作者头像 李华
网站建设 2026/9/3 7:32:24

【开题答辩过程】以《基于SpringBoot和MySQL的家庭财务管理系统》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看

个人简介慕婉学姐精通Java、PHP、微信小程序、Python、Golang和安卓开发等语言,擅长开发大数据、深度学习、网站、小程序、安卓应用和算法项目。平时从事项目定制开发、代码讲解、答辩教学和文档编写,也掌握一些降重技巧。感谢大家的持续关注&#xff01…

作者头像 李华