2015-09-01 86 views
1

我有兩個日期如下,需要格式化他們,但我收到以下異常。我的主要問題是當天的th rd etc。我找不到這個問題的答案。我檢查了所有這些鏈接12345我想我應該用正則表達式,但不能確定怎麼樣。如何在Java中格式化非日期日期?

10th Dec 2019 -> 2019-12-10 
10th December 2019 -> 2019-12-10 

代碼

String date1 = "10th Dec 2019"; 
Date date = new SimpleDateFormat("dd MMMM YYYY").parse(date1); 
System.err.println(date); 
String date2 = new SimpleDateFormat("yyyy-mm-dd").format(date); 
System.err.println(date2); 

異常

Exception in thread "main" java.text.ParseException: Unparseable date: "10th Dec 2019" 
+0

您使用的是Java 8還是Java 7? – RealSkeptic

+0

這已經有了一個答案。看到這個http://stackoverflow.com/a/6987802/1737819 – Willmore

+0

@RealSkeptic我使用7 – Jack

回答

5

用一個空字符串替換所有預期的不想要的sufiixes,然後解析:

String s = "10th Dec 2019"; 

    SimpleDateFormat fmt = new SimpleDateFormat("dd MMM yyyy", Locale.ENGLISH); 
    Date d = fmt.parse(s.replaceFirst("th|nd|st|rd", "")); 
    System.out.println("d = " + d); 
+0

如果我使用正則表達式怎麼樣? – Jack

+0

我的答案確實使用了正則表達式。 replaceFirst()接受一個正則表達式,並用第二個參數替換第一個匹配的子字符串。 –

+0

解析日期** 2019年8月10日**? – Willmore

0

你可以把它們放在單引號這樣的模式中逃避日期格式明確的文字:

Date date = new SimpleDateFormat("dd'th' MMMM YYYY").parse(date1);

然而,該解決方案不支持通配符,我假設你需要爲「ST」和「第二」的後綴。所以我建議你根據正則表達式對輸入進行一些預處理以刪除「st/nd/th」後綴。

0

爲了您的字符串,你可以使用:

Date date = new SimpleDateFormat("dd'th' MMMM YYYY").parse(date1); 
+0

的問題是與第1,第12等 – Jack

+0

@Jack'12th'是不是在你的問題沒有被請求的issueand 1日。你應該添加它。 – Jens

2

你可以先刪除量詞,然後解析日期照常。

像這樣的東西會工作:

String[] input = {  "10th Dec 2019", 
         "10th December 2019", 
         "1st December 2019", 
         "3rd December 2019" 
       }; 

DateFormat df = new SimpleDateFormat("dd MMMM yyyy"); 
DateFormat result = new SimpleDateFormat("dd-MM-yyyy"); 
for(String s : input) { 
    s = s.replaceAll("^(\\d+).{2}", "$1"); //The .{2} will match any two characters, which should be the th, st, nd and rd. 
    System.out.println(result.format(df.parse(s))); 
} 

產量:

10-12-2019 
10-12-2019 
01-12-2019 
03-12-2019 
-1

你可以試試這個方法:

String suffix = getSuffix(inputDate.get(Calendar.DAY_OF_MONTH)); 
DateFormat dateFormat = new SimpleDateFormat(" d'" + suffix + "' MMMM yyyy"); 
return dateFormat.format(currentCalDate.getTime()); 

// getSuffix 
private String getSuffix(int inputDay) { 
    if (day >= 11 && day <= 13) { 
     return "th"; 
    } 
    switch (day % 10) { 
     case 1: 
      return "st"; 
     case 2: 
      return "nd"; 
     case 3: 
      return "rd"; 
     default: 
      return "th"; 
    } 
} 
+0

後綴只能替換而不是在DateFormat中添加後綴。這個問題更容易,更清潔。 –

0

在Java 7,它concidered最好的做法是使用Joda time用於處理日期。所以我建議你看看它。 api更容易使用,然後Date。 (分析太)

當您稍後遷移到Java 8時,java.time(JSR-310)軟件包基於Joda Time,因此您將可以輕鬆遷移。

+0

實際上,java.time的靈感來自Joda-Time,但不是基於它。概念基本相同,但您的代碼可能會有很大差異。如果使用Java 8或更高版本,最好從java.time開始。 –

+0

您是否可以擴展您的答案以顯示一些示例代碼以更直接地解決該問題? –