2016-08-03 43 views
5

Poniżej znajduje się kod, który konwertuje ciąg do obiektu datetime Joda w oparciu o ciąg formatu.Joda Joda czas wielokrotnego formatowania kodu daty formatu

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

Ten kod zapewnia pożądany wynik, ale użycie wyjątku jako przepływu sterowania nie jest dobrym projektem. Zoptymalizuj kod.

+2

lubię ten kod :) –

+0

W tym API połowu jest OK. Przenieś FORMATERY poza metodę (jako pole) i statyczny finał. –

Odpowiedz

2

Korzystanie Joda, można spróbować zrobić to

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

To jest najlepsze rozwiązanie przy użyciu Joda-Time +1. Ale jestem pewien, że moja lib Time4J przy użyciu [MultiFormatParser] (http://time4j.net/javadoc-en/net/time4j/format/expert/MultiFormatParser.html) jest jeszcze szybszy ze względu na więcej wewnętrznych optymalizacji ;-) sposób, Java-8 jest DUŻO wolniejsza, bardzo smutna, patrz także ten [problem JDK] (https://bugs.openjdk.java.net/browse/JDK-8152273). –