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

Java中解析英文日期字符串为指定格式LocalDate/LocalDateTime的问题

解析英文日期字符串并转换为目标格式

完全可以实现你的需求!而且根本不需要用正则表达式——这时候用正则纯属过度设计,Java 8之后的java.time日期时间库已经能完美搞定这件事。

为什么会报错?

你遇到DateTimeParseException的核心问题是Locale不匹配:
你的输入字符串是英文格式(月份缩写Jan、时段标识AM),但你设置了Locale.GERMAN来解析。德国本地化环境下,时段标识不是AM/PM,而是vorm.(上午)和nachm.(下午),解析器无法识别AM,直接导致解析失败。

正确实现方案

核心思路

  1. 用英文Locale解析输入的英文日期字符串,得到LocalDateTime对象;
  2. 再用自定义格式器将LocalDateTime(或从中提取的LocalDate)转换为你需要的目标格式。

完整代码示例

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class DateConversionExample {
    public static void main(String[] args) {
        String inputDateStr = "Jan 1, 2019 12:00:00 AM";
        
        // 1. 定义输入格式的解析器,必须指定英文Locale
        DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern(
            "MMM d, yyyy hh:mm:ss a", 
            Locale.ENGLISH
        );
        
        // 解析为LocalDateTime
        LocalDateTime localDateTime = LocalDateTime.parse(inputDateStr, inputFormatter);
        
        // 2. 定义目标输出格式
        DateTimeFormatter dateOutputFormatter = DateTimeFormatter.ofPattern("dd.MM.yyyy");
        DateTimeFormatter dateTimeOutputFormatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm");
        
        // 转换为目标格式字符串
        String formattedLocalDate = localDateTime.format(dateOutputFormatter);
        String formattedLocalDateTime = localDateTime.format(dateTimeOutputFormatter);
        
        // 输出结果
        System.out.println("LocalDate格式: " + formattedLocalDate); // 输出: 01.01.2019
        System.out.println("LocalDateTime格式: " + formattedLocalDateTime); // 输出: 01.01.2019 00:00
    }
}

关键细节说明

  • 解析格式串"MMM d, yyyy hh:mm:ss a"完全匹配输入结构:
    • MMM:匹配月份缩写(如Jan)
    • d:匹配1位或2位的日期(如1)
    • yyyy:匹配4位年份
    • hh:匹配12小时制的小时数
    • a:匹配英文时段标识(AM/PM)
  • 输出格式用HH表示24小时制小时,所以12:00 AM会自动转换为00:00(符合24小时制规范)
  • 如果只需要LocalDate,直接从LocalDateTime提取即可,无需重复解析:
    LocalDate localDate = localDateTime.toLocalDate();
    

关于正则表达式的疑问

用正则处理日期字符串确实属于过度设计:

  • 日期解析涉及很多复杂规则(本地化月份缩写、12/24小时制转换、闰年判断等),正则很难覆盖所有边界情况;
  • java.time库是专门为日期时间处理设计的,代码可读性、健壮性远高于正则,维护成本更低。

内容的提问来源于stack exchange,提问作者Georgios

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:41:37