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

时间:2008-10-22 21:26:11

标签: java date time parsing

是否有一种简单的方法来解析可能是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]);

并通过以下方式验证:

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

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

3 个答案:

答案 0 :(得分:11)

是的,请使用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"));

答案 1 :(得分:2)

java.time

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

java.time.format包及其java.time.format.DateTimeFormatter类使用类似于Ray Myers在accepted 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

答案 2 :(得分:1)

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

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

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

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