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

Java中如何将“Saturday 19th May”字符串转为Date对象?

解决Java日期字符串"Saturday 19th May"的解析问题

嗨,这个坑我之前踩过!你现在的问题核心是日期格式字符串和输入的模式完全不匹配,尤其是输入里的日期带了th后缀,而你用的EE/dd/MM模式完全没考虑这一点,所以才会抛出ParseException。

下面分两种方案给你解决:

方案1:使用旧的SimpleDateFormat(兼容Java 7及以下)

你需要调整格式模式,把日期的后缀作为可选字面量处理,同时匹配正确的星期、日期、月份格式:

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

public class DateParseExample {
    public static void main(String[] args) throws ParseException {
        // 关键是这个格式:匹配星期全称、带后缀的日期、月份全称
        DateFormat format = new SimpleDateFormat("EEEE d['st']['nd']['rd']['th'] MMMM", Locale.ENGLISH);
        format.setLenient(false); // 开启严格解析,避免自动修正错误的日期
        Date date = format.parse("Saturday 19th May");
        System.out.println(date);
    }
}

模式解释:

  • EEEE:匹配星期的全称(比如Saturday)
  • d:匹配数字日期(配合可选字面量,自动兼容1st/2nd/3rd/4th等所有后缀)
  • MMMM:匹配月份的全称(比如May)
  • ['st']['nd']['rd']['th']:方括号表示这些是可选的字面量,不管日期带哪种后缀都能匹配

方案2:推荐使用Java 8+的java.time API(更安全、更清晰)

SimpleDateFormat是线程不安全的,Java 8之后推出的java.time包是更好的选择,用法类似但更健壮:

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

public class ModernDateParseExample {
    public static void main(String[] args) {
        // 构建支持大小写不敏感的格式化器(避免因后缀大小写问题解析失败)
        DateTimeFormatter formatter = new DateTimeFormatterBuilder()
                .parseCaseInsensitive()
                .appendPattern("EEEE d['st']['nd']['rd']['th'] MMMM")
                .toFormatter(Locale.ENGLISH);
        
        LocalDate localDate = LocalDate.parse("Saturday 19th May", formatter);
        System.out.println(localDate);
        
        // 如果需要转换成旧的java.util.Date对象(兼容旧代码)
        Date utilDate = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
        System.out.println(utilDate);
    }
}

为什么推荐这个方案?

  • LocalDate是不可变类,线程安全,不会出现SimpleDateFormat的并发问题
  • API设计更清晰,支持更多灵活的配置(比如上面的大小写不敏感解析)
  • 日期操作更直观,避免旧API的诸多坑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:28:13