2016-08-03 87 views
5

以下是基於格式字符串將字符串轉換爲Joda datetime對象的代碼。Java Joda時間多個日期格式代碼優化

public Datetime ConvertDateTime(String dateStr) { 

    List<DateTimeFormatter> FORMATTERS = 
     Arrays.asList(
      DateTimeFormat.forPattern("MM/dd/yyyy hh:mm:ss.SSS a"), 
      DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss.SSS"), 
      DateTimeFormat.forPattern("MM-dd-yyyy hh:mm:ss.SSS a"), 
      DateTimeFormat.forPattern("MM dd yyyy hh:mm:ss.SSS a"), 
      DateTimeFormat.forPattern("MM-dd-yyyy hh.mm.ss.SSS a")); 

    if (dateStr != null) { 
    for (DateTimeFormatter formatter : FORMATTERS) { 
     try { 
     DateTime dt = formatter.parseDateTime(dateStr); 
     return dt; 
     } catch (IllegalArgumentException e) { 
     // Go on to the next format 
     } 
    } 
    } 
    return null; 
} 

此代碼提供我所希望的結果,但使用異常作爲控制流不是一個好的design.Please優化代碼。

+2

我喜歡這個代碼:) –

+0

在這個API美中不足的是OK。將FORMATTERS移到方法(如字段)和靜態final之外。 –

回答

2

使用喬達,你可以嘗試這樣做

import org.joda.time.DateTime; 
import org.joda.time.format.DateTimeFormat; 
import org.joda.time.format.DateTimeFormatter; 
import org.joda.time.format.DateTimeFormatterBuilder; 
import org.joda.time.format.DateTimeParser; 

public class JODATester { 

    public static void main(String[] args) { 
     DateTimeParser[] parserList = { DateTimeFormat.forPattern("MM/dd/yyyy hh:mm:ss.SSS a").getParser(), 
       DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss.SSS").getParser(), 
       DateTimeFormat.forPattern("MM-dd-yyyy hh:mm:ss.SSS a").getParser(), 
       DateTimeFormat.forPattern("MM dd yyyy hh:mm:ss.SSS a").getParser(), 
       DateTimeFormat.forPattern("MM-dd-yyyy hh.mm.ss.SSS a").getParser() }; 
     DateTimeFormatter formatter = new DateTimeFormatterBuilder().append(null, parserList).toFormatter(); 

     DateTime date1 = formatter.parseDateTime("2010-01-01 01:01:01.001"); 
     DateTime date2 = formatter.parseDateTime("08/03/2016 03:01:33.790 PM"); 

     System.out.println(date2); 

     System.out.println(date1); 

//  
//  DateTime dt = new DateTime(); 
//  DateTimeFormatter fmt = DateTimeFormat.forPattern("MM/dd/yyyy hh:mm:ss.SSS a"); 
//  String str = fmt.print(dt); 
//  
//  System.out.println(str); 

    } 

} 
+0

這是使用Joda-Time +1的最佳解決方案。但我相信,由於更多的內部優化,使用[MultiFormatParser](http://time4j.net/javadoc-en/net/time4j/format/expert/MultiFormatParser.html)的我的lib Time4J仍然更快;-)通過Java-8的速度非常慢,非常難過,也請參閱[JDK-issue](https://bugs.openjdk.java.net/browse/JDK-8152273)。 –