如何通过LocalTime.parse将时间字符串有效转换成Java 8的时间实例?
- 内容介绍
- 文章标签
- 相关推荐
本文共计852个文字,预计阅读时间需要4分钟。
`LocalTime.parse 只能处理纯时间格式(例如:
常见错误现象:Text '2024-05-20 14:30' could not be parsed at index 0。
- 确认输入是否真的只需要时间:如果原始数据含日期但你只关心时分秒,先用字符串截取或正则提取时间段再传给
parse - 若需完整时间点,请改用
LocalDateTime.parse或ZonedDateTime.parse,别硬塞进LocalTime - 默认解析器只支持 ISO_LOCAL_TIME 格式(
"HH:mm"、"HH:mm:ss"、"HH:mm:ss.SSS")
自定义格式必须显式传入 DateTimeFormatter
遇到 "14:30:00 PM" 或 "2:30 PM" 这类非 ISO 格式,LocalTime.parse 会失败,因为默认不识别 AM/PM 或 12 小时制。必须手动构造 DateTimeFormatter 并作为第二个参数传入。
示例:
立即学习“Java免费学习笔记(深入)”;
LocalTime time = LocalTime.parse("2:30 PM", DateTimeFormatter.ofPattern("h:mm a"));
-
h表示 1–12 小时制,H才是 0–23;a匹配 AM/PM(注意大小写敏感) - 空格不能省略——
"h:mma"会解析"2:30PM",但"2:30 PM"必须写成"h:mm a" - 中文环境若用
"上午"/"下午",需指定 Locale:DateTimeFormatter.ofPattern("h:mm a", Locale.CHINA)
解析失败时不会静默返回 null,而是抛异常
LocalTime.parse 是严格模式,任何格式偏差(多空格、错位冒号、超长毫秒位)都会触发 DateTimeParseException,不会返回默认值或降级处理。
- 生产代码中务必包裹
try-catch,尤其当输入来自用户或外部 API - 避免用
parse直接处理不可信字符串;可先用DateTimeFormatter.parseBest尝试多种格式,或预校验正则 - 注意时区无关性:
LocalTime不含时区,所以"14:30+08:00"这类带偏移的字符串也无法解析——得用OffsetTime.parse
性能与线程安全:Formatter 复用比重复创建更关键
DateTimeFormatter 是线程安全且推荐复用的,而每次调用 LocalTime.parse 本身开销极小。真正影响性能的是反复 new formatter。
- 把常用 formatter 声明为
static final,例如:private static final DateTimeFormatter HH_MM = DateTimeFormatter.ofPattern("H:mm") - 别在循环里写
LocalTime.parse(s, DateTimeFormatter.ofPattern("H:mm"))—— formatter 创建成本远高于 parse - ISO 格式(如
"14:30")走内置优化路径,比自定义 formatter 快约 2–3 倍,优先用标准格式传输时间
LocalTime 对边界极其敏感——少个零("9:30" vs "09:30")、多一个空格、混用全角符号,全都会炸。本文共计852个文字,预计阅读时间需要4分钟。
`LocalTime.parse 只能处理纯时间格式(例如:
常见错误现象:Text '2024-05-20 14:30' could not be parsed at index 0。
- 确认输入是否真的只需要时间:如果原始数据含日期但你只关心时分秒,先用字符串截取或正则提取时间段再传给
parse - 若需完整时间点,请改用
LocalDateTime.parse或ZonedDateTime.parse,别硬塞进LocalTime - 默认解析器只支持 ISO_LOCAL_TIME 格式(
"HH:mm"、"HH:mm:ss"、"HH:mm:ss.SSS")
自定义格式必须显式传入 DateTimeFormatter
遇到 "14:30:00 PM" 或 "2:30 PM" 这类非 ISO 格式,LocalTime.parse 会失败,因为默认不识别 AM/PM 或 12 小时制。必须手动构造 DateTimeFormatter 并作为第二个参数传入。
示例:
立即学习“Java免费学习笔记(深入)”;
LocalTime time = LocalTime.parse("2:30 PM", DateTimeFormatter.ofPattern("h:mm a"));
-
h表示 1–12 小时制,H才是 0–23;a匹配 AM/PM(注意大小写敏感) - 空格不能省略——
"h:mma"会解析"2:30PM",但"2:30 PM"必须写成"h:mm a" - 中文环境若用
"上午"/"下午",需指定 Locale:DateTimeFormatter.ofPattern("h:mm a", Locale.CHINA)
解析失败时不会静默返回 null,而是抛异常
LocalTime.parse 是严格模式,任何格式偏差(多空格、错位冒号、超长毫秒位)都会触发 DateTimeParseException,不会返回默认值或降级处理。
- 生产代码中务必包裹
try-catch,尤其当输入来自用户或外部 API - 避免用
parse直接处理不可信字符串;可先用DateTimeFormatter.parseBest尝试多种格式,或预校验正则 - 注意时区无关性:
LocalTime不含时区,所以"14:30+08:00"这类带偏移的字符串也无法解析——得用OffsetTime.parse
性能与线程安全:Formatter 复用比重复创建更关键
DateTimeFormatter 是线程安全且推荐复用的,而每次调用 LocalTime.parse 本身开销极小。真正影响性能的是反复 new formatter。
- 把常用 formatter 声明为
static final,例如:private static final DateTimeFormatter HH_MM = DateTimeFormatter.ofPattern("H:mm") - 别在循环里写
LocalTime.parse(s, DateTimeFormatter.ofPattern("H:mm"))—— formatter 创建成本远高于 parse - ISO 格式(如
"14:30")走内置优化路径,比自定义 formatter 快约 2–3 倍,优先用标准格式传输时间
LocalTime 对边界极其敏感——少个零("9:30" vs "09:30")、多一个空格、混用全角符号,全都会炸。
