接受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文档会发现以下内容:
“对于解析,除非需要分隔两个相邻的字段,否则忽略模式字母的数量。”