2015-05-06 38 views
1

我必須輸入日期並將其轉換爲通用日期格式。 爲此,我創建了一個函數(非泛型函數),下面是函數的示例代碼。將給定日期轉換爲通用日期格式?

public class ConvertTimestampFormat{ 
    public void evaluate(String dateInString) { 
     if (!StringUtils.isEmpty(dateInString)) { 

      SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd hh:mm"); 
      try { 
       Date date = formatter.parse(dateInString); 
       System.out.println(date); 
       System.out.println(formatter.format(date)); 
      } catch (ParseException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
    public static void main(String[] args) { 
     ConvertTimestampFormat obj = new ConvertTimestampFormat(); 
     obj.evaluate("2014-06-14-12:58"); 
    } 
} 

如果示例代碼中存在錯誤,請更正。

在這裏,我已經硬編碼輸入日期格式2014-06-14-12:58。在這裏,我會得到不同類型的日期格式,如2014/06/14-12:58,2014-Mar-14-12:58(這樣我現在可以得到5到6種格式)。我想用if來檢查格式,然後根據格式爲每種格式編寫單獨的代碼。但是如果將來有新的日期格式,它將會失敗。

我的輸出格式總是應該是yyyy-MM-dd hh:mm:ss

請建議我通用的方式(通用功能)來做到這一點。

+0

要小心_generic_,它的Java世界它意味着這樣的事情'List ',我認爲你的意思_flexible_超過一般不是嗎? – superbob

+1

如果您有兩種輸入日期格式,則每種類型都需要兩個日期格式化器。然後你解析第一個,捕獲異常,然後解析第二個,如果在這裏捕獲到異常,那麼輸入不匹配兩個格式化器。 –

+0

@superbob我同意你的看法,它不僅僅是通用的。 – Ram

回答

1

你給

SimpleDateFormat formatter = `new SimpleDateFormat("yyyy-MM-dd hh:mm")`; 

因此,該字符串應該是這樣obj.evaluate("2014-06-14 12:58");

硬編碼字符串應該是準確的圖案,裏面SimpleDateFormat()

+0

我認爲這是一個排字錯誤 – Blip

+0

@Blip是的,這是我在問題中提到的錯字,它是示例代碼。 – Ram

2

兩種方式做到這一點提及。您可以爲格式化程序字符串提供日期或您的硬編碼和鏈接(非常難看)您要使用的每種格式。我建議將鏈式解決方案分解爲多種方法。

解決方案1:

import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 

import org.apache.commons.lang3.StringUtils; 

public class ConvertTimestampFormat { 

    private SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm"); 
    private Date dateObject; 

    public void evaluate(String dateString, String dateFormat) { 
     if (!StringUtils.isEmpty(dateString)) { 

      SimpleDateFormat inputFormat = new SimpleDateFormat(dateFormat); 
      try { 
       dateObject = inputFormat.parse(dateString); 
      } catch (ParseException e) { 
       //Parse failed. String does not match the formatter. 
      } 

      if(dateObject != null) { 
       System.out.println(outputFormat.format(dateObject)); 
      } 
     } 
    } 

    public static void main(String[] args) { 
     ConvertTimestampFormat obj = new ConvertTimestampFormat(); 
     obj.evaluate("2014-03-14-12:58", "yyyy-MM-dd-hh:mm"); 
     obj.evaluate("2014-Mar-14-12:58", "yyyy-MMM-dd-hh:mm"); 
    } 
} 

醜陋的解決方案:

import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 

import org.apache.commons.lang3.StringUtils; 

public class ConvertTimestampFormat { 

    private SimpleDateFormat inputFormat1 = new SimpleDateFormat("yyyy-MM-dd-hh:mm"); 
    private SimpleDateFormat inputFormat2 = new SimpleDateFormat("yyyy-MMM-dd-hh:mm"); 
    private SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm"); 
    private Date dateObject; 

    public void evaluate(String dateInString) { 
     if (!StringUtils.isEmpty(dateInString)) { 

      try { 
       dateObject = inputFormat1.parse(dateInString); 
      } catch (ParseException e) { 
       try { 
        dateObject = inputFormat2.parse(dateInString); 
       } catch (ParseException e1) { 
        //String didn't match either formatters. You'll want to do something about this! 
       } 
      } 

      if(dateObject != null) { 
       System.out.println(outputFormat.format(dateObject)); 
      } 
     } 
    } 

    public static void main(String[] args) { 
     ConvertTimestampFormat obj = new ConvertTimestampFormat(); 
     obj.evaluate("2014-03-14-12:58"); 
     obj.evaluate("2014-Mar-14-12:58"); 
    } 
} 
+0

感謝您的回覆我有這個解決方案在我心中只是尋找更好的解決方案,如果有的話。 – Ram

2

目前,似乎不是什麼 「神奇」 的方法來處理在Java中所有可能的日期格式。

你能做的最好,在另一個答案(need flexible datetime conversion with joda)建議,是這樣的:

private static final SimpleDateFormat[] FORMATTERS = new SimpleDateFormat[] { 
    new SimpleDateFormat("yyyy-MM-dd hh:mm"), 
    new SimpleDateFormat("yyyy/MM/dd-hh:mm"), 
    [...]}; 

private static Date parseDate(String dateInString) { 
    Date date = null; 
    for (int i = 0; i < FORMATTERS.length; i++) { 
     try { 
      date = FORMATTERS[i].parse(dateInString); 
      break; 
     } catch (ParseException e) { 
      // Nothing to do, try the next one 
     } 
    } 
    return date; 
} 

若要使用此代碼,您只需要調用parseDate與日期字符串。 要添加新格式,請將其添加到FORMATTERS陣列。

這不是最可能最漂亮的代碼。通過異常處理代碼和中斷循環可能是一種不好的做法。關於這個請參見link1link2

爲了提高你的代碼,你可以考慮使用Joda-Time(Java的< = 7)或Java 8 java.time類:DateTimeFormat/DateTimeFormatterLocalDateTime(joda)/LocalDateTime(java8),超過標準/舊的提供enhanced API

使用Java 8的Java。時間類:

private static final DateTimeFormatter[] FORMATTERS = new DateTimeFormatter[] { 
    DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm"), 
    DateTimeFormatter.ofPattern("yyyy/MM/dd-hh:mm"), 
    [...]}; 

private static Optional<LocalDateTime> parseDate(String dateInString) { 
    Optional<LocalDateTime> date = Optional.empty(); 
    for (int i = 0; i < FORMATTERS.length; i++) { 
     try { 
      date = Optional.of(LocalDateTime.parse(dateInString, FORMATTERS[i])); 
      break; 
     } catch (DateTimeParseException e) { 
      // Nothing to do, try the next one 
     } 
    } 
    return date; 
} 

我還添加了一些Optional處理結果的emptyness如果dateInString不能被解析,而不是null這是bad