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

Java 17中将dd/MMM/yyyy转yyyyMMdd遇解析异常求助

问题解决:Java 17日期格式转换解析异常

核心原因

  • Locale不匹配:MMM代表月份缩写(如Jan、Feb),解析过程依赖Locale配置。Java 1.8与Java 17的默认Locale可能存在差异,若输入日期的月份缩写对应特定Locale但代码未明确指定,就会触发解析失败。
  • SimpleDateFormat的兼容性问题:该类本身线程不安全,且高版本Java对日期解析的严格性有所提升,旧代码的容错逻辑在新版本中不再适用。

推荐解决方案(Java 8+ 标准写法)

使用java.time包下的新日期API(DateTimeFormatter、LocalDate),这是线程安全、设计更合理的官方替代方案,代码示例如下:

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

public class DateConverter {
    public static String convertDate(String dateStr) {
        // 根据输入月份缩写的语言指定Locale,英文缩写用Locale.ENGLISH,中文用Locale.CHINA
        DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("dd/MMM/yyyy", Locale.ENGLISH);
        DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("yyyyMMdd");
        
        LocalDate date = LocalDate.parse(dateStr, inputFormatter);
        return date.format(outputFormatter);
    }
}

关键注意点

  • 明确指定Locale:必须根据输入日期字符串的月份缩写语言,设置对应的Locale,避免依赖JVM默认Locale引发的跨版本兼容性问题。
  • 弃用SimpleDateFormat:Java 8之后官方已不推荐使用该类,新API在功能、安全性和可读性上均更优。

旧代码兼容修复(不推荐)

若需保留旧代码结构,需明确指定Locale并保证线程安全(如每次创建实例或使用ThreadLocal):

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class OldDateConverter {
    public static String convertDate(String dateStr, String currentFormat, String newFormat) throws ParseException {
        // 明确指定匹配输入月份缩写的Locale
        SimpleDateFormat inputFormat = new SimpleDateFormat(currentFormat, Locale.ENGLISH);
        SimpleDateFormat outputFormat = new SimpleDateFormat(newFormat);
        
        Date date = inputFormat.parse(dateStr);
        return outputFormat.format(date);
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 11:06:19