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
相关产品推荐
相关产品推荐

