2008-10-22 73 views
4

有一种简单的方法来分析,可能是在MM/DD/YYYY,或M/d/yyyy的,或一些组合的日期?即在单个数字日或月之前零是可选的。日期时间解析接受1999年5月5日和1999年5月5日,等

做手工,可以使用:

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电话,说会处理呢?

回答

1

看起来像我的问题是用 “MM/DD/YYYY” 时,我应该用 “MM/DD/YYYY”。大写d是“一年中的一天”,而小写d是“日在月”。

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

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

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

10

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

实际上,对于雷的问题,日期格式应该是: DateFormat的DF =新的SimpleDateFormat( “MM/DD/YYYY”); – Tebari 2008-10-22 21:37:19

2

java.time

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

java.time.format包及其java.time.format.DateTimeFormatter类使用的模式代码与Ray Myers在accepted Answer中看到的类似。虽然相似,但它们有所不同。特别是他们对重复字符的数量是严格的。如果你说MM,那么每月必须补齐零,否则你会得到一个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年1月2日

相关问题