Java中如何将含月份名称、带h/m/s标识的时间字符串转为Date对象
问题解答
替换h/m/s字符的方案可行性
可以先替换原字符串中的h、m、s字符得到目标格式,只要处理好替换逻辑避免生成多余符号即可,不过实际上有更简便的方案不需要提前做字符串替换,后面会提到。
异常问题的根因
你遇到的两个问题都属于格式化配置错误:
- 月份识别失败:没有指定英文本地化
Locale,默认Locale为中文时无法匹配October这类英文全拼月份名 - 小时部分变为00:00:00:大概率是模式串写错,要么是用了12小时制的
h没有搭配AM/PM标识,要么是模式串漏写了时分秒的匹配规则
最优实现方案
不需要提前做字符串替换,直接在模式串中用单引号包裹h/m/s作为常量匹配即可,完整代码如下:
import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.Locale; import java.util.Date; import java.time.ZoneId; public class TimeParseTest { public static void main(String[] args) { String rawTime = "10h 57m 20s October 13 2020"; // 构造格式化器,指定英文Locale匹配英文月份 DateTimeFormatter formatter = DateTimeFormatter .ofPattern("H'h' m'm' s's' MMMM dd yyyy", Locale.US); // 解析为LocalDateTime LocalDateTime localDateTime = LocalDateTime.parse(rawTime, formatter); // 转为Date对象 Date date = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant()); System.out.println(date); } }
模式串说明
H:匹配24小时制的小时,不要用12小时制的h,否则需要额外配置AM/PM匹配规则'h'/'m'/'s':单引号包裹的内容会被当成普通常量匹配,不需要提前替换原字符串字符MMMM:匹配全拼的月份名称,必须搭配Locale.US等英文Locale才能正确识别英文月份
如果你坚持要先做字符串替换
注意处理替换逻辑避免生成多余符号,替换代码和后续解析代码如下:
// 字符串替换逻辑 String processedTime = rawTime .replace("h ", ":") .replace("m ", ":") .replace("s ", " "); // 对应模式串 DateTimeFormatter formatter = DateTimeFormatter .ofPattern("H:m:s MMMM dd yyyy", Locale.US);
内容的提问来源于stack exchange,提问作者Nfernandez
相关产品推荐
相关产品推荐

