接受05/05/1999和5/5/1999等的日期时间解析

有没有一种简单的方法来解析可能是MM / DD / yyyy,M / D / yyyy或某种组合的日期? 即零在一个数字日或月之前是可选的。

要手动完成,可以使用:

String[] dateFields = dateString.split("/"); int month = Integer.parseInt(dateFields[0]); int day = Integer.parseInt(dateFields[1]); int year = Integer.parseInt(dateFields[2]); 

并validation:

 dateString.matches("\\d\\d?/\\d\\d?/\\d\\d\\d\\d") 

是否会调用SimpleDateFormat或JodaTime来处理这个问题?

是的,使用setLenient:

 DateFormat df = new SimpleDateFormat("MM/dd/yyyy"); df.setLenient(true); System.out.println(df.parse("05/05/1999")); System.out.println(df.parse("5/5/1999")); 

java.time

Java 8及更高版本包含java.time框架。 此框架废弃了此处其他答案中讨论的旧java.util.Date/.Calendar类。

java.time.format包及其java.time.format.DateTimeFormatter类使用类似于Ray Myers 接受的Answer中所见的模式代码。 虽然相似,但它们有所不同。 特别是他们对重复字符的数量是严格的。 如果你说MM ,那么月份必须填0,否则你会得到DateTimeParseException 。 如果月份数可能有也可能没有填充零,只需使用单字符M

在此示例代码中,请注意输入字符串的月份数如何填充零,而日期数字不是。 两者都由单字符模式处理。

 DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "M/d/yyyy" ); LocalDate localDate = formatter.parse ( "01/2/2015" , LocalDate :: from ); 

转储到控制台。

 System.out.println ( "localDate: " + localDate ); 

localDate:2015-01-02

看起来我的问题是使用“MM / DD / yyyy”时我应该使用“MM / dd / yyyy”。 大写字母D是“一年中的一天”,而小写字母d是“一天中的日”。

 new SimpleDateFormat("MM/dd/yyyy").parse(dateString); 

这份工作。 此外,“M / d / y”可互换使用。 仔细阅读SimpleDateFormat API文档会发现以下内容:

“对于解析,除非需要分隔两个相邻的字段,否则忽略模式字母的数量。”