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

Java如何将含英文月份的日期字符串转换为MM-dd-yyyy格式

Java环境下英文日期字符串转换实现方案

1. 固定格式转换实现("JUN 28, 2022"转"06-28-2022")

优先使用Java 8及以上版本内置的java.time时间API实现,相比旧的SimpleDateFormat线程安全、API设计更合理,不会出现并发解析错乱的问题。
实现代码如下:

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

public class DateConvertTest {
    public static void main(String[] args) {
        String source = "JUN 28, 2022";
        // 配置输入解析规则:MMM匹配月份缩写,指定英文环境,关闭大小写敏感适配全大写的月份格式
        DateTimeFormatter inputParser = DateTimeFormatter.ofPattern("MMM dd, uuuu", Locale.ENGLISH)
                .withParseCaseSensitive(false);
        // 配置输出规则:MM生成两位数字月份
        DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("MM-dd-uuuu", Locale.ENGLISH);

        LocalDate parsedDate = LocalDate.parse(source, inputParser);
        String target = parsedDate.format(outputFormatter);
        // 输出结果:06-28-2022
        System.out.println(target);
    }
}

2. 兼容英文月份全称/缩写的通用转换方案

不需要手动维护月份和数字的映射Map,直接通过DateTimeFormatter的扩展配置即可兼容任意大小写的月份全称(如January、JANUARY)、月份缩写(如JAN、Jan、jun),自动映射为两位数字月份。

通用方法实现

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

public class DateMonthUtil {
    // 预构建同时支持月份全称、月份缩写的灵活解析器,全局复用无并发问题
    private static final DateTimeFormatter FLEXIBLE_MONTH_PARSER = new DateTimeFormatterBuilder()
            .appendPattern("[MMMM][MMM] dd, uuuu") // []包裹的为可选匹配段,同时适配全称、缩写
            .toFormatter(Locale.ENGLISH)
            .withParseCaseSensitive(false); // 关闭大小写敏感,适配任意大小写的月份输入

    private static final DateTimeFormatter TWO_DIGIT_MONTH_FORMATTER = DateTimeFormatter.ofPattern("MM", Locale.ENGLISH);

    /**
     * 从英文日期字符串中提取两位数字格式的月份
     * @param dateInput 传入的日期字符串,支持任意大小写的英文月份全称/缩写,格式需符合「月 日, 年」结构
     * @return 两位数字月份,范围01-12
     */
    public static String getTwoDigitMonth(String dateInput) {
        LocalDate date = LocalDate.parse(dateInput, FLEXIBLE_MONTH_PARSER);
        return date.format(TWO_DIGIT_MONTH_FORMATTER);
    }

    // 测试用例
    public static void main(String[] args) {
        System.out.println(getTwoDigitMonth("JUN 28, 2022")); // 输出06
        System.out.println(getTwoDigitMonth("january 5, 2023")); // 输出01
        System.out.println(getTwoDigitMonth("FEB 10, 2024")); // 输出02
        System.out.println(getTwoDigitMonth("March 15, 2022")); // 输出03
    }
}

关键注意点

  • 必须指定Locale.ENGLISH参数,否则会读取运行环境的默认语言,在中文环境下解析英文月份会直接抛出异常
  • 解析器实例可以定义为全局静态常量复用,DateTimeFormatter是线程安全的,不需要每次调用都新建实例
  • 如果你的输入日期结构不是「月 日, 年」的格式,只需要修改appendPattern里的模式串即可:MMMM代表匹配月份全称,MMM代表匹配月份缩写
  • 禁止使用已过时的Date、SimpleDateFormat类处理日期转换,这类类天生非线程安全,高并发场景下会出现随机的解析结果错误。如果是Java 7及以下的老旧环境,可以引入ThreeTen Backport包使用上述java.time的能力。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 14:36:23