2012-05-25 5 views
5

Ich habe eine Anforderung, wo Datum in den folgenden Formaten übergeben werden kann, bevor sie zu Solr indiziert werden. Hier sind die Beispiele der übermittelten Daten Wie erstellt man einen generischen Datumsformatierer in Java für Solr?

String dateStr = "2012-05-23T00:00:00-0400"; 
String dateStr1 = "May 24, 2012 04:57:40 GMT"; 
String dateStr2 = "2011-06-21"; 
Das Standard-Solr-Format ist "JJJJ-MM-TT'T'HH: mm: SS'Z '".

Ich habe SimpleDateFormat ausprobiert aber ist nicht in der Lage, ein generisches Programm zu schreiben, um verschiedene Formate zu unterstützen. Es endet mit Parsen Ausnahmen.

Ich habe auch versucht, joda Zeit, aber bisher nicht gelungen in UTC-Konvertierung.

public static String toUtcDate(final String iso8601) { 
     DateTime dt = ISO_PARSE_FORMAT.parseDateTime(iso8601); 
     DateTime utcDt = dt.withZone(ZONE_UTC); 
     return utcDt.toString(ISO_PRINT_FORMAT); 
    }

Gibt es eine Standardbibliothek, um dies zu erreichen?

Alle Hinweise werden geschätzt.

Dank

Antwort

11

Ich versuche einfach, die verschiedenen Formate, bis ich einen Treffer erhalten:

public static String toUtcDate(String dateStr) { 
    SimpleDateFormat out = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); 
    // Add other parsing formats to try as you like: 
    String[] dateFormats = {"yyyy-MM-dd", "MMM dd, yyyy hh:mm:ss Z"}; 
    for (String dateFormat : dateFormats) { 
     try { 
      return out.format(new SimpleDateFormat(dateFormat).parse(dateStr)); 
     } catch (ParseException ignore) { } 
    } 
    throw new IllegalArgumentException("Invalid date: " + dateStr); 
} 

Ich bin einer Bibliothek nicht bewusst, dass dies der Fall ist. Hier

+0

Vielen Dank für Ihre Antwort. Ich habe versucht, diese Lösung zu vermeiden und zu suchen, ob es eine generische gibt, die für jedes Datumsformat geeignet ist, solange es gültig ist. Das Problem bei diesem Ansatz ist immer, dass es ein neues Format gibt, der Code bricht, wenn wir ihn nicht im Array hinzufügen. Ich habe gehofft, wenn es ein verfügbares Tool gibt, das dies bereits ermöglicht. – Shamik

+0

Ich habe einmal so etwas geschrieben, und ich konnte nur ungefähr ein Dutzend oder so denken - Leute verwenden nicht so viele verschiedene Datumsformate tatsächlich. Das Hauptproblem war, zu entscheiden, ob '01-02-2012' Jan oder Feb ist, weil es sowohl mit ISO' dd-MM-yyyy' * als auch mit dem dummen amerikanischen Format 'MM-dd-yyyy' richtig analysiert werden kann. – Bohemian

+0

Das amerikanische Format ist leicht visuell zu analysieren. Und es "dumm" zu nennen, ist keine Möglichkeit, für einen Mangel an richtigem i18n zu antworten. –

0

ist die Antwort: Converting ISO 8601-compliant String to java.util.Date

Sobald Sie Ihr Datum haben, wissen Sie, wie Sie Ihre UTC-Zeit zu bekommen.


Edit: Die akzeptierte Antwort joda Zeit aber jaxb nicht verwendet.

Übrigens, woher kommen diese Formate?

String dateStr = "2012-05-23T00:00:00-0400"; 
String dateStr1 = "May 24, 2012 04:57:40 GMT"; 
String dateStr2 = "2011-06-21"; 

Wenn sie von einem Gebietsschema zum anderen unterschiedlich sind, kann es möglich sein, sie durch DateFormat.getDateTimeInstance generiert wurden (..., ...) so vielleicht versuchen, herauszufinden, welche verwendet worden ist.

+0

Vielen Dank für Ihre Antwort, aber ich glaube nicht, Joda Zeit ist in der Lage, dieses Format "24. Mai 2012 04:57:40 GMT" zu behandeln, es sei denn, Sie formatieren es ausdrücklich. – Shamik

+0

Ich habe keine Kontrolle über die Daten, sie werden von verschiedenen Quellen gecrawlt und werden indiziert. – Shamik