2016-08-03 23 views
5

Aşağıda, bir dizeyi format dizisine bağlı olarak Joda datetime nesnesine dönüştüren kod verilmiştir.Java Joda zamanı çoklu tarih biçimi kod eniyilemesi

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; 
} 

Bu kod bana istenen sonucu sağlar ancak kontrol akışı olarak istisna kullanarak iyi bir Design.Please kodu optimize değil.

+2

:) –

+0

yapıyor deneyin olabilir sorun yok. FORMATTER'leri yöntem dışı (alan olarak) ve statik sonlandır. –

cevap

2

joda kullanarak, bu API catch bu

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); 

    } 

} 
Bu kodu gibi
+0

Joda-Time +1'i kullanarak en iyi çözüm budur. Fakat eminim ki [MultiFormatParser] (http://time4j.net/javadoc-en/net/time4j/format/expert/MultiFormatParser.html) kullanarak lib Time4J'm daha fazla dahili optimizasyondan dolayı daha hızlıdır; yol, Java-8 daha yavaş, çok üzücü, ayrıca bkz. bu [JDK-issue] (https://bugs.openjdk.java.net/browse/JDK-8152273). –