news 2026/5/13 23:51:21

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/5/12 14:21:25

从看天吃饭到屏幕管田,智能设备守护农田提质增效

春耕秋收,四季更替,传统农业依赖自然的“看天吃饭”模式已在科技的推动下悄然发生变化。如今,当人们走入田间,便会看到各类智能化设备分工明确、协同运行。田埂旁的气象监测站昼夜守护,田间虫害监测和土壤湿度监控装置…

作者头像 李华
网站建设 2026/5/12 14:23:48

2026年,RPA选型是否应该优先考虑国产信创厂商?

一、国内外主流RPA厂商全景扫描 1. 国际厂商阵营 UiPath - RPA领域的全球领导者,以其低代码开发平台、强大的机器人流程自动化套件和活跃的开发者社区著称。产品涵盖Studio(开发工具)、Orchestrator(管控平台)和机器人…

作者头像 李华
网站建设 2026/5/3 9:31:27

首开告捷!招商林屿缦岛203套售罄,诠释改善市场的“产品主义”胜利

2月的西安楼市,因招商林屿缦岛而显得格外不同。这个位于凤城五路的改善项目,在首次开盘当日即实现203套房源全部去化,交出了一份令人瞩目的成绩单。在行业深度调整的背景下,这样的市场表现无疑具有风向标意义:它昭示着…

作者头像 李华
网站建设 2026/5/2 3:43:07

史上最强大语言模型的知识库-MaxKB部署实践

大家好,不知道大家还记得大名鼎鼎的jumpserver吗?市面上开源为数不多的堡垒机产品,由飞致云开发的,本次我要隆重介绍这款知识库大模型产品(MaxKB)也是飞致云开发的社区开源产品,可以免费建立50个…

作者头像 李华