Java 8 LocalDateTime类详解与实战应用

发布时间:2026/11/5 20:00:34

Java 8 LocalDateTime类详解与实战应用 1. LocalDateTime类概述LocalDateTime是Java 8中引入的一个不可变日期时间对象它表示没有时区的日期时间通常被视为年-月-日-小时-分钟-秒的组合。作为java.time包的核心类之一它完美替代了旧版的java.util.Date和java.util.Calendar提供了更直观、更安全的API设计。在实际开发中LocalDateTime特别适合以下场景需要同时处理日期和时间但不关心时区的业务逻辑生日、纪念日等不需要时区概念的日期时间记录与数据库交互时存储本地时间如MySQL的DATETIME类型2. 核心方法详解2.1 对象创建方法2.1.1 now()系列方法// 获取当前系统默认时区的日期时间 LocalDateTime now LocalDateTime.now(); // 获取指定时区的当前日期时间 LocalDateTime nowInTokyo LocalDateTime.now(ZoneId.of(Asia/Tokyo)); // 使用自定义时钟常用于测试 Clock testClock Clock.fixed(Instant.parse(2023-01-01T00:00:00Z), ZoneId.systemDefault()); LocalDateTime testTime LocalDateTime.now(testClock);注意在生产环境中使用now()时要注意时钟回拨问题。对于高精度时间要求场景建议使用NTP服务同步服务器时间。2.1.2 of()系列方法// 指定年月日时分创建秒和纳秒默认为0 LocalDateTime dt1 LocalDateTime.of(2023, Month.JANUARY, 15, 14, 30); // 指定年月日时分秒创建纳秒默认为0 LocalDateTime dt2 LocalDateTime.of(2023, 1, 15, 14, 30, 45); // 组合LocalDate和LocalTime创建 LocalDate date LocalDate.of(2023, 1, 15); LocalTime time LocalTime.of(14, 30); LocalDateTime dt3 LocalDateTime.of(date, time);2.2 时间获取与计算2.2.1 获取时间分量LocalDateTime dt LocalDateTime.now(); int year dt.getYear(); // 2023 Month month dt.getMonth(); // JANUARY int day dt.getDayOfMonth(); // 15 DayOfWeek dow dt.getDayOfWeek();// MONDAY int hour dt.getHour(); // 14 int minute dt.getMinute(); // 30 int second dt.getSecond(); // 45 int nano dt.getNano(); // 1234567892.2.2 时间加减计算LocalDateTime dt LocalDateTime.of(2023, 1, 15, 14, 30); // 加操作 LocalDateTime nextWeek dt.plusWeeks(1); LocalDateTime nextHour dt.plusHours(1); // 减操作 LocalDateTime lastMonth dt.minusMonths(1); LocalDateTime yesterday dt.minusDays(1); // 链式调用 LocalDateTime complex dt.plusDays(1).minusHours(3).plusMinutes(30);实战经验处理月末日期加减时要特别注意。例如1月31日加1个月会得到2月28日或29日而不是不存在的2月31日。2.3 时间调整与转换2.3.1 with()方法调整LocalDateTime dt LocalDateTime.of(2023, 1, 15, 14, 30); // 直接调整字段 LocalDateTime newYear dt.withYear(2024); LocalDateTime midnight dt.withHour(0).withMinute(0); // 使用TemporalAdjusters LocalDateTime lastDayOfMonth dt.with(TemporalAdjusters.lastDayOfMonth()); LocalDateTime nextMonday dt.with(TemporalAdjusters.next(DayOfWeek.MONDAY));2.3.2 时间截断LocalDateTime dt LocalDateTime.of(2023, 1, 15, 14, 30, 45, 123456789); // 截断到分钟 LocalDateTime truncatedToMinutes dt.truncatedTo(ChronoUnit.MINUTES); // 结果: 2023-01-15T14:30 // 截断到小时 LocalDateTime truncatedToHours dt.truncatedTo(ChronoUnit.HOURS); // 结果: 2023-01-15T14:003. 实用技巧与最佳实践3.1 日期时间格式化LocalDateTime dt LocalDateTime.now(); // 默认格式化为ISO格式 String isoFormat dt.toString(); // 2023-01-15T14:30:45.123 // 自定义格式化 DateTimeFormatter formatter DateTimeFormatter.ofPattern(yyyy-MM-dd HH:mm:ss); String customFormat dt.format(formatter); // 2023-01-15 14:30:45 // 解析字符串 LocalDateTime parsedDt LocalDateTime.parse(2023-01-15T14:30:45); LocalDateTime customParsed LocalDateTime.parse(2023-01-15 14:30, DateTimeFormatter.ofPattern(yyyy-MM-dd HH:mm));3.2 时间比较与间隔计算LocalDateTime dt1 LocalDateTime.of(2023, 1, 15, 14, 30); LocalDateTime dt2 LocalDateTime.of(2023, 1, 16, 10, 0); // 比较 boolean isBefore dt1.isBefore(dt2); // true boolean isAfter dt1.isAfter(dt2); // false // 计算时间间隔 Duration duration Duration.between(dt1, dt2); long hours duration.toHours(); // 19 long minutes duration.toMinutes(); // 1170 // 计算日期间隔忽略时间部分 Period period Period.between(dt1.toLocalDate(), dt2.toLocalDate()); int days period.getDays(); // 13.3 与旧API的互操作// 转换为java.util.Date LocalDateTime dt LocalDateTime.now(); Instant instant dt.atZone(ZoneId.systemDefault()).toInstant(); Date legacyDate Date.from(instant); // 从Date转换 Date date new Date(); LocalDateTime fromLegacy LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());4. 常见问题与解决方案4.1 时区处理误区虽然LocalDateTime不包含时区信息但在与Instant或ZonedDateTime转换时需要特别注意// 错误做法直接转换会丢失时区信息 LocalDateTime dt LocalDateTime.now(); Instant instant dt.toInstant(ZoneOffset.UTC); // 抛出异常 // 正确做法先指定时区再转换 Instant correctInstant dt.atZone(ZoneId.systemDefault()).toInstant();4.2 性能优化建议对于频繁使用的DateTimeFormatter应该缓存重用避免重复创建在循环中处理大量日期计算时考虑使用不可变对象链式调用序列化时优先使用ISO格式减少解析出错概率4.3 数据库交互技巧// JPA实体类中的使用示例 Entity public class Event { Column(name event_time) private LocalDateTime eventTime; // 使用AttributeConverter处理特殊格式 Convert(converter LocalDateTimeConverter.class) private LocalDateTime customFormatTime; } // 自定义转换器 Converter(autoApply true) public class LocalDateTimeConverter implements AttributeConverterLocalDateTime, String { private final DateTimeFormatter formatter DateTimeFormatter.ofPattern(yyyy/MM/dd HH:mm); Override public String convertToDatabaseColumn(LocalDateTime attribute) { return attribute ! null ? attribute.format(formatter) : null; } Override public LocalDateTime convertToEntityAttribute(String dbData) { return dbData ! null ? LocalDateTime.parse(dbData, formatter) : null; } }5. 实际应用案例5.1 工作日计算public static LocalDateTime addWorkDays(LocalDateTime startDate, int workDays) { LocalDateTime result startDate; int addedDays 0; while (addedDays workDays) { result result.plusDays(1); if (result.getDayOfWeek() ! DayOfWeek.SATURDAY result.getDayOfWeek() ! DayOfWeek.SUNDAY) { addedDays; } } return result; }5.2 营业时间校验public boolean isWithinBusinessHours(LocalDateTime checkTime) { LocalTime time checkTime.toLocalTime(); DayOfWeek day checkTime.getDayOfWeek(); // 工作日9:00-18:00 if (day ! DayOfWeek.SATURDAY day ! DayOfWeek.SUNDAY) { return !time.isBefore(LocalTime.of(9, 0)) !time.isAfter(LocalTime.of(18, 0)); } // 周六9:00-12:00 else if (day DayOfWeek.SATURDAY) { return !time.isBefore(LocalTime.of(9, 0)) !time.isAfter(LocalTime.of(12, 0)); } // 周日休息 return false; }掌握LocalDateTime的各种用法可以显著提升Java日期时间处理的效率和准确性。在实际项目中建议结合具体业务场景选择合适的方法并注意处理好时区和异常边界情况。
延伸阅读

更多相关文章

2026/11/4 3:42:05

dirsearch目录扫描实战:敏感目录泄露挖掘与字典爆破全解析

1. 先把目录扫描这件事想明白1.1 目录扫描在Web安全评估里的定位目录扫描工具我用过不少,dirsearch 是最常用的一把。它做的事情一句话就能说清:通过字典爆破,快速发现 Web 站点上那些不会出现在导航菜单里的目录和文件,也就是常说…

2026/11/5 16:51:33

EasyU优启通PE维护盘实战指南:制作、启动与核心操作全解析

1. 为什么一个PE维护盘值得单独拿出来聊装系统、修引导、救数据、清病毒,这些活儿但凡干过几次的人都知道,真正决定效率的往往不是你手速多快,而是手边那套PE环境靠不靠谱。EasyU(圈内习惯叫优启通)就是在这个场景下被…

2026/11/5 16:26:13

Rust原来很简单二:所有权系统

Part 2 核心篇 —— 所有权系统 本篇覆盖 第 6 ~ 10 章:所有权、借用与引用、生命周期、字符串与切片、内存模型。 ⚠️ 这是全书最重要的一篇。 把它吃透,Rust 从此“很简单”;跳过它,你会处处碰壁。请慢下来,动手敲每一段代码。 第 6 章 所有权:Rust 的第一性原理 6…

2026/11/5 15:00:49

基于Hadoop+Spark的民宿智能推荐系统设计与实现

1. 项目概述:大数据时代的民宿智能推荐这个毕业设计项目融合了当前大数据领域最主流的技术栈,构建了一个完整的民宿推荐系统解决方案。作为一名长期从事大数据系统开发的工程师,我认为这个选题非常贴合实际应用场景——随着旅游业的复苏和共享…

2026/11/5 14:10:30

ADS122U04IPWR+STM32F427ZI工业级温度测量信号链设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 14:10:30

UART接口24位ADC搭配RS485,解决远距离温度监控难题

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 14:10:30

UART接口24位ADC搭配PIC18F46K22的RTD与热电偶测温实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 15:39:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 0:02:07

多智能体协作系统架构设计与实践优化

1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中…

2026/11/5 0:02:07

大模型系统性入门实战指南:从原理到部署微调的全链路路线

提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#…

2026/11/5 0:02:07

鸿蒙文件系统沙箱机制解析与开发实践

1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的…

2026/11/5 15:39:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑