2016-03-15 258 views
2

我想解析日期字符串,我的問題是那些字符串可以有不同的dateformats取決於他們是否談論今天,明天或其他日子。用不同的日期格式解析日期字符串

  • 如果他們談論今天事件的格式是這樣的:20:45
  • 如果他們談論未來事件的格式是:明天20:45
  • 而關於另一天的格式,如果他們說話是︰2016年5月10日

所以我想知道如果我可以解析他們三個相同的DateFormat,如果不是什麼將是最好的方式。

DateFormat format = new SimpleDateFormat("EEEE d ' de' MMMM ' de' yyyy", locale); 
+0

你使用哪個Java版本? – Mirco

+0

不,你不能使用相同的DateFormat實例解析它們,因爲這需要解析值以獲得給定的格式。如果您確定這些是您可以獲得的唯一格式,那麼您可以首先檢查字符串的長度== 5(如果是今天的話),然後檢查字符串是否包含「明天」,如果其中沒有一個是真的,則可以格式化它與DateFormat。 –

回答

-2
if (DateFormat.charAt(0).isDigit() && DateFormat.charAt(1).isDigit() && DateFormat.charAt(2).isLetterOrDigit()==false .... { 
new String SimpleDateFormat= '15.03.2016'; 
else { 

if (DateFormat.charAt(0).isLetter('t') && DateFormat.charAt(1).isLetter('o') && and so on 
{ SimpleDateFormat='16.03.2016' 

,您可以通過1個字符改變1的條件相匹配的數據格式的所有類型

+2

請至少向OP提供可編譯代碼。 – Spotted

-1

你不能使用相同的SimpleDateFormat解析所有類型,並不會是一個很好的做法沒有,沒有可讀的和更復雜的不加入任何特殊的價值,我會嘗試這樣的事情:

private static final SimpleDateFormat formatHHMM = new SimpleDateFormat("hh:mm"); 
private static final SimpleDateFormat formatOther = new SimpleDateFormat("MMM dd yyyy"); 

private static String convertDate(Date curDate) { 
    if (isToday(curDate)) { 
     return formatHHMM.format(curDate); 
    } 
    else if (isTomorrow(curDate)) { 
     return "Tomorrow " + formatHHMM.format(curDate); 
    } 
    return formatOther.format(curDate); 
} 

private static boolean isToday(Date curDate) { 
    Date today = Calendar.getInstance().getTime(); 
    return today.equals(curDate); 
} 

private static boolean isTomorrow(Date curDate) { 
    Calendar calendar = Calendar.getInstance(); 
    calendar.add(Calendar.DATE, 1); 
    Date tomorrow = calendar.getTime(); 
    return tomorrow.equals(curDate); 
} 
//Check the code with this 
public static void main(String[] args) 
{ 
    Date curDate = new Date(); 
    System.out.println(convertDate(curDate)); 

    Calendar calendar = Calendar.getInstance(); 
    calendar.add(Calendar.DATE, 1); 
    Date tomorrow = calendar.getTime(); 
    System.out.println(convertDate(tomorrow)); 

    calendar = Calendar.getInstance(); 
    calendar.add(Calendar.DATE, 15); 
    Date other = calendar.getTime(); 
    System.out.println(convertDate(other)); 
} 
+1

我認爲OP想要解析**解析**不同的日期格式,而不是**格式**。 – Spotted

-1

我不認爲這是可能使用相同的格式解析3種格式。雖然可能僅用一個格式化程序解析前兩個格式,但意義的不同(今天或明天)意味着不同的邏輯,這是不能用單個格式化程序獲得的。

我建議你單獨處理每種情況下,試圖此起彼伏:

try { 
     return LocalDate 
       .now() 
       .atTime(LocalTime.parse(date)); 
    } catch (DateTimeParseException e) { 
     try { 
      return LocalDate 
        .now() 
        .plusDays(1) 
        .atTime(LocalTime.parse(date, DateTimeFormatter.ofPattern("'tomorrow' HH:mm"))); 
     } catch (DateTimeParseException e1) { 
      return LocalDate 
        .parse(date, DateTimeFormatter.ofPattern("MMMM dd yyyy", Locale.ENGLISH)) 
        .atStartOfDay(); 
     } 
    } 

我不知道有關控制流的清晰度,但。如果輸入格式的數量增加,可能需要重構爲更清晰的東西。

+0

那麼,我不喜歡通過異常捕獲控制流,但那不是你的錯(在這裏被API限制所強制)。無論如何,表現會受到影響,這是肯定的。 –

+0

我不認爲增加異常流程的邏輯是一個明確的解決方案。 – cralfaro