You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 09:09:02