是否有一种简单的方法来解析可能是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来处理这个问题?
答案 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 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会发现以下内容:
“对于解析,除非需要分隔两个相邻的字段,否则将忽略模式字母的数量。”