2008-10-22 107 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日

相關問題