localtime是java 8引入的不可变、线程安全的时间类,表示不含日期和时区的本地时间(如14:30:45.123),适用于营业时间校验等纯时间逻辑;通过now()、of()、parse()创建,用plus/minus或with系列方法生成新实例,支持isbefore/isafter等比较及datetimeformatter格式化。

LocalTime 是 Java 8 引入的不可变、线程安全的时间类,专门用于表示“不含日期的本地时间”,即 时:分:秒.纳秒(例如 14:30:45.123)。它不包含时区、也不依赖系统时钟,适合做纯时间逻辑处理(如营业时间校验、倒计时、时间间隔计算等)。
如何获取 LocalTime 实例
常见创建方式有以下几种:
-
当前系统时间:用
LocalTime.now(),默认使用系统默认时区的时钟(实际取的是当前时刻的“时间部分”);若需指定时钟,可用LocalTime.now(Clock) -
指定时分秒:如
LocalTime.of(9, 30)→09:30;LocalTime.of(15, 45, 30, 123_000_000)→15:45:30.123 -
解析字符串:用
LocalTime.parse("16:20:05")(默认格式HH:mm:ss);支持自定义格式,如LocalTime.parse("4:30 PM", DateTimeFormatter.ofPattern("h:mm a")) -
从其他时间对象提取:比如
LocalDateTime.now().toLocalTime()或Instant.now().atZone(ZoneId.systemDefault()).toLocalTime()
怎么修改(生成新实例)时分秒
LocalTime 是不可变的,所有“修改”操作都返回一个新对象,原实例不变。常用调整方法:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
加减时间量:用
plusHours()、minusMinutes()、plus(10, ChronoUnit.SECONDS)等。例如:LocalTime.of(23, 59).plusSeconds(120)→00:01:00(自动跨日,但不改变日期信息) -
直接设置字段:如
withHour(7)、withMinute(15)、withSecond(0)、withNano(500_000) -
截断纳秒:用
truncatedTo(ChronoUnit.SECONDS)可去掉纳秒部分,得到整秒时间
怎么比较与判断时间关系
LocalTime 支持直观的比较操作:
- 用
isBefore()、isAfter()、equals()判断顺序或相等性,例如:time1.isBefore(time2) - 用
compareTo()获取比较结果(-1/0/1),可用于排序 - 检查是否在某个范围内:
!time.isBefore(start) && !time.isAfter(end),等价于time.compareTo(start) >= 0 && time.compareTo(end)
怎么格式化输出或转为字符串
推荐使用 DateTimeFormatter 而非 toString()(后者固定为 HH:mm:ss.SSS 格式):
- 预设格式:
time.format(DateTimeFormatter.ISO_LOCAL_TIME)→"14:25:36.123" - 自定义格式:
time.format(DateTimeFormatter.ofPattern("hh:mm a"))→"02:25 PM" - 简洁显示(无秒/纳秒):
time.format(DateTimeFormatter.ofPattern("HH:mm"))→"14:25"
注意:LocalTime 不代表“某个具体时刻”,它没有时区和日期上下文,因此不能直接转换为时间戳(Instant)或毫秒值;如需此类操作,必须结合日期(LocalDate)和时区(ZoneId)构造 ZonedDateTime 后再转换。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










