news 2026/4/24 10:33:20

JDK 8 日期时间 API:常用方法速查手册

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
JDK 8 日期时间 API:常用方法速查手册

JDK 8 日期时间 API:常用方法速查手册

JDK 8 日期时间 API:常用方法速查手册

引言

在 Java 8 之前,处理日期和时间是许多开发者的“噩梦”。java.util.Datejava.util.Calendarjava.text.SimpleDateFormat等类存在诸多设计缺陷,例如线程不安全、API 设计混乱(月份从0开始)、可变对象导致状态难以预测等问题。

Java 8 引入了全新的日期时间 API(java.time包),它基于 JSR-310 规范,参考了优秀的 Joda-Time 库,为我们提供了一套线程安全、设计清晰、功能强大的现代化解决方案。本文将通过大量代码示例,带你快速掌握 JDK 8 日期时间 API 的核心用法。

核心类概览

java.time包下的核心类各司其职,以下是几个最常用的:

  • LocalDate:仅包含日期部分(年、月、日)。
  • LocalTime:仅包含时间部分(时、分、秒、纳秒)。
  • LocalDateTime:日期和时间的组合,但不包含时区信息。
  • ZonedDateTime:包含时区信息的完整日期时间。
  • Instant:时间戳,代表自 1970-01-01 00:00:00 UTC 以来的一个瞬间。
  • DateTimeFormatter:用于格式化和解析日期时间对象的线程安全工具。
  • Period:用于计算两个LocalDate之间的日期差距。
  • Duration:用于计算两个时间点之间的时间差距。
常用方法实战

接下来,我们将通过代码示例来展示这些类的常用操作。

获取当前时间

importjava.time.LocalDate;importjava.time.LocalTime;importjava.time.LocalDateTime;importjava.time.ZonedDateTime;importjava.time.Instant;importjava.time.ZoneId;publicclassDateTimeNow{publicstaticvoidmain(String[]args){// 获取当前日期LocalDatedate=LocalDate.now();System.out.println("当前日期: "+date);// 输出示例: 2026-04-24// 获取当前时间LocalTimetime=LocalTime.now();System.out.println("当前时间: "+time);// 输出示例: 08:46:13.123456789// 获取当前日期和时间 (最常用)LocalDateTimedateTime=LocalDateTime.now();System.out.println("当前日期时间: "+dateTime);// 输出示例: 2026-04-24T08:46:13.123456789// 获取指定时区的日期时间 (例如上海)ZonedDateTimezonedDateTime=ZonedDateTime.now(ZoneId.of("Asia/Shanghai"));System.out.println("当前北京时间: "+zonedDateTime);// 输出示例: 2026-04-24T08:46:13.123456789+08:00[Asia/Shanghai]// 获取当前时间戳 (精确到纳秒)Instantinstant=Instant.now();System.out.println("当前时间戳: "+instant);// 输出示例: 2026-04-24T00:46:13.123Z}}

创建指定时间

importjava.time.LocalDate;importjava.time.LocalTime;importjava.time.LocalDateTime;importjava.time.Month;publicclassDateTimeOf{publicstaticvoidmain(String[]args){// 创建指定日期LocalDatedate=LocalDate.of(2026,Month.APRIL,24);System.out.println("指定日期: "+date);// 2026-04-24// 也可以直接用数字表示月份 (1-12)LocalDatedate2=LocalDate.of(2026,4,24);System.out.println("指定日期2: "+date2);// 2026-04-24// 创建指定时间LocalTimetime=LocalTime.of(14,30,0);System.out.println("指定时间: "+time);// 14:30:00// 创建指定日期时间LocalDateTimedateTime=LocalDateTime.of(2026,4,24,14,30,0);System.out.println("指定日期时间: "+dateTime);// 2026-04-24T14:30}}

格式化与解析
DateTimeFormatter是线程安全的,可以定义为静态常量重复使用。

importjava.time.LocalDateTime;importjava.time.format.DateTimeFormatter;importjava.util.Locale;publicclassDateTimeFormat{// 推荐定义为静态常量,线程安全privatestaticfinalDateTimeFormatterFORMATTER=DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");privatestaticfinalDateTimeFormatterCHINESE_FORMATTER=DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH时mm分",Locale.CHINA);publicstaticvoidmain(String[]args){LocalDateTimenow=LocalDateTime.now();// --- 格式化:日期时间 -> 字符串 ---Stringformatted=now.format(FORMATTER);System.out.println("格式化后: "+formatted);// 2026-04-24 08:46:13StringchineseFormatted=now.format(CHINESE_FORMATTER);System.out.println("中文格式: "+chineseFormatted);// 2026年04月24日 08时46分// --- 解析:字符串 -> 日期时间 ---LocalDateTimeparsed=LocalDateTime.parse("2026-04-24 15:30:00",FORMATTER);System.out.println("解析后: "+parsed);// 2026-04-24T15:30}}

时间计算与调整
这是新 API 最强大的地方之一,操作非常直观。注意:所有操作都会返回一个新的对象,原对象不可变。

importjava.time.LocalDate;importjava.time.LocalDateTime;importjava.time.temporal.TemporalAdjusters;importjava.time.DayOfWeek;publicclassDateTimeArithmetic{publicstaticvoidmain(String[]args){LocalDateTimenow=LocalDateTime.now();System.out.println("基准时间: "+now);// --- plus/minus 系列:增加或减少时间 ---LocalDateTimetomorrow=now.plusDays(1);// 加1天System.out.println("明天此时: "+tomorrow);LocalDateTimetwoHoursLater=now.plusHours(2);// 加2小时System.out.println("两小时后: "+twoHoursLater);LocalDateTimelastMonth=now.minusMonths(1);// 减1个月System.out.println("上个月: "+lastMonth);// --- with 系列:直接修改某个字段 ---LocalDateTimefirstMinuteOfHour=now.withMinute(0).withSecond(0);// 设置为本小时的第1分钟System.out.println("本小时的第1分钟: "+firstMinuteOfHour);LocalDateTimeyear2030=now.withYear(2030);// 修改年份为2030System.out.println("2030年的今天: "+year2030);// --- TemporalAdjusters:高级时间调整器 ---// 获取本月第一天LocalDatefirstDayOfMonth=LocalDate.now().with(TemporalAdjusters.firstDayOfMonth());System.out.println("本月第一天: "+firstDayOfMonth);// 获取本月最后一天LocalDatelastDayOfMonth=LocalDate.now().with(TemporalAdjusters.lastDayOfMonth());System.out.println("本月最后一天: "+lastDayOfMonth);// 获取下一个周一LocalDatenextMonday=LocalDate.now().with(TemporalAdjusters.next(DayOfWeek.MONDAY));System.out.println("下个周一: "+nextMonday);// 获取本月第一个周日LocalDatefirstSundayOfYear=LocalDate.now().with(TemporalAdjusters.firstInMonth(DayOfWeek.SUNDAY));System.out.println("本月第一个周日: "+firstSundayOfYear);}}

计算时间间隔

importjava.time.LocalDate;importjava.time.LocalTime;importjava.time.Duration;importjava.time.Period;importjava.time.temporal.ChronoUnit;publicclassDateTimeInterval{publicstaticvoidmain(String[]args){// --- Period: 计算日期间隔 (基于日历) ---LocalDatestartDate=LocalDate.of(2025,1,1);LocalDateendDate=LocalDate.of(2026,4,24);Periodperiod=Period.between(startDate,endDate);System.out.printf("相隔 %d 年 %d 月 %d 天%n",period.getYears(),period.getMonths(),period.getDays());// 相隔 1 年 3 月 23 天// --- Duration: 计算时间间隔 (基于时间) ---LocalTimestartTime=LocalTime.of(9,0);LocalTimeendTime=LocalTime.of(17,30);Durationduration=Duration.between(startTime,endTime);System.out.printf("会议时长: %d 小时 %d 分钟%n",duration.toHours(),duration.toMinutesPart());// 会议时长: 8 小时 30 分钟// --- ChronoUnit: 更简单的单位计算 ---longdaysBetween=ChronoUnit.DAYS.between(startDate,endDate);System.out.println("总天数差: "+daysBetween);// 总天数差: 479longhoursBetween=ChronoUnit.HOURS.between(startTime,endTime);System.out.println("总小时数差: "+hoursBetween);// 总小时数差: 8}}
总结

JDK 8 的日期时间 API 彻底改变了 Java 中处理时间的方式。它通过清晰的类设计、不可变的对象模型和丰富的操作方法,解决了旧 API 的所有痛点。强烈建议所有 Java 开发者在新项目中全面采用java.time包,它将让你的代码更加健壮、清晰和易于维护。

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

MinIO 对象存储系统:

1. MinIO 是什么? MinIO 是一个兼容 Amazon S3 API 的对象存储系统,常用于私有云、混合云、Kubernetes、AI/ML 数据集、备份、日志、图片/视频/附件等非结构化数据场景。官方将其定位为高性能、云原生、S3-compatible object store,强调可横…

作者头像 李华
网站建设 2026/4/24 10:29:22

Real-Anime-Z行业落地:国产动漫工业化流程中风格锚定与质量可控实践

Real-Anime-Z行业落地:国产动漫工业化流程中风格锚定与质量可控实践 1. 项目概述 Real-Anime-Z是一款基于Stable Diffusion技术开发的写实向动漫风格大模型,由国内团队Devilworld训练发布。该模型创新性地实现了介于写实与纯动漫之间的2.5D风格表现&am…

作者头像 李华
网站建设 2026/4/24 10:26:10

WindowsCleaner:5大智能功能彻底解决Windows系统卡顿与C盘爆红难题

WindowsCleaner:5大智能功能彻底解决Windows系统卡顿与C盘爆红难题 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服! 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner 当Windows系统运行数月后&#xff…

作者头像 李华
网站建设 2026/4/24 10:25:50

终极网盘下载方案:免客户端高速下载六大网盘文件

终极网盘下载方案:免客户端高速下载六大网盘文件 【免费下载链接】baiduyun 油猴脚本 - 一个免费开源的网盘下载助手 项目地址: https://gitcode.com/gh_mirrors/ba/baiduyun 还在为网盘下载速度慢、必须安装客户端而烦恼吗?网盘直链下载助手正是…

作者头像 李华