2012-05-25 11 views
5

Mam wymaganie, w którym data może być przekazana w poniższych formatach przed indeksowaniem ich do Solr. Oto przykłady terminów przekazywania Jak utworzyć ogólny program do formatowania daty w Javie dla Solr?

String dateStr = "2012-05-23T00:00:00-0400"; 
String dateStr1 = "May 24, 2012 04:57:40 GMT"; 
String dateStr2 = "2011-06-21"; 
Standardowy format Solr to "rrrr-MM-dd'T'HH: mm: ss'Z '".

Próbowałem już SimpleDateFormat, ale nie jestem w stanie napisać ogólnego programu obsługującego różne formaty. Kończy się wyrzucanie wyjątków.

Próbowałem również czasu Joda, ale dotychczas nie powiodło się w konwersji UTC.

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

Czy istnieje standardowa biblioteka do osiągnięcia tego?

Wszelkie wskazówki będą mile widziane.

Dzięki

Odpowiedz

11

po prostu spróbować różnych formatów aż dostaję obrażeń:

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

nie jestem świadomy biblioteki, który to robi.

+0

Dzięki za odpowiedź. Próbowałem uniknąć tego rozwiązania i sprawdzić, czy jest dostępny ogólny, który może obsłużyć dowolny format daty, o ile jest ważny. Problem z tym podejściem jest za każdym razem, gdy pojawia się nowy format, kod ulega złamaniu, chyba że dodamy go do tablicy. Miałem nadzieję, że istnieje jakieś dostępne narzędzie, które już to umożliwia. – Shamik

+0

Kiedyś napisałem coś takiego, a mogłem myśleć tylko o około tuzinie - ludzie nie używają tak wielu różnych formatów daty. Głównym problemem było ustalenie, czy '01-02-2012' ma wartość Jan lub Feb, ponieważ można go poprawnie przeanalizować przy użyciu zarówno ISO' dd-MM-yyyy' *, jak i * głupiego formatu amerykańskiego 'MM-dd-rrrr'. – Bohemian

+0

Format amerykański jest łatwy do wizualnego analizowania. I nazywanie tego "głupim" nie jest sposobem na odpowiedź za brak właściwego i18n. –

0

Oto odpowiedź: Converting ISO 8601-compliant String to java.util.Date

Gdy masz Data wiesz, jak uzyskać czas UTC.


Edit: Zaakceptowanych odpowiedź nie używa czasu Joda ale JAXB.

Nawiasem mówiąc, skąd biorą się te formaty?

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

Jeśli są one różne od lokalizacji do drugiej, może być możliwe były generowane przez DateFormat.getDateTimeInstance (..., ...), więc może spróbować dowiedzieć się, które zostały wykorzystane.

+0

Dziękuję za odpowiedź, ale nie sądzę, że czas Joda jest w stanie obsłużyć ten format "24 maja 2012 04:57:40 GMT", chyba że wyraźnie sformatujesz go. – Shamik

+0

Nie mam kontroli nad datami, są one pobierane z innego źródła i są indeksowane. – Shamik

Powiązane problemy