2012-05-25 3 views
5

Ho un requisito in cui è possibile passare la data nei seguenti formati prima di indicizzarli su Solr. Ecco gli esempi di date superate Come creare un formattatore di date generico in java per Solr?

String dateStr = "2012-05-23T00:00:00-0400"; 
String dateStr1 = "May 24, 2012 04:57:40 GMT"; 
String dateStr2 = "2011-06-21"; 
Il formato standard Solr è "aaaa-MM-gg'T'HH: mm: ss'Z '".

Ho provato SimpleDateFormat ma non è in grado di scrivere un programma generico per supportare vari formati. Finisce per lanciare eccezioni parse.

Ho anche provato il tempo joda, ma non è stato finora soddisfacente nella conversione 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); 
    }

Esiste una libreria standard per raggiungere questo obiettivo?

Qualsiasi suggerimento sarà apprezzato.

Grazie

risposta

11

Cerco solo i vari formati fino a ottenere un successo:

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

io non sono a conoscenza di una biblioteca che fa questo.

+0

Grazie per la risposta. Stavo cercando di evitare questa soluzione e cercando se ce n'è uno disponibile, che può soddisfare qualsiasi formato di data, purché valido. Il problema con questo approccio è ogni volta che c'è un nuovo formato, il codice si rompe a meno che non lo aggiungiamo nell'array. Speravo se ci fosse uno strumento disponibile che già approvvigiona a questo. – Shamik

+0

Una volta scrissi qualcosa del genere, e potevo solo pensare a circa una dozzina circa - le persone non usano effettivamente molti formati di date differenti. Il problema principale era decidere se '01-02-2012' è Jan o Feb, perché può essere analizzato con OK sia' gg-MM-aaaa' * che * lo stupido formato americano 'MM-gg-aaaa'. – Bohemian

+0

Il formato americano è facilmente analizzabile visivamente. E definirlo "stupido" non è un modo di rispondere per mancanza di un proprio i18n. –

0

ecco la risposta: Converting ISO 8601-compliant String to java.util.Date

Una volta che avete la vostra data, è sapere come ottenere il vostro tempo UTC.


Edit: La risposta accettata non usa il tempo Joda ma JAXB.

A proposito, da dove vengono questi formati?

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

Se sono diversi da un locale all'altro, può essere possibile sono stati generati da DateFormat.getDateTimeInstance (..., ...) così forse cercare di capire che è stato usato.

+0

Grazie per la risposta, ma non credo che il tempo di Joda sia in grado di gestire questo formato "24 maggio 2012 04:57:40 GMT" a meno che non lo si formuli esplicitamente. – Shamik

+0

Non ho il controllo sulle date, vengono sottoposte a scansione da fonti diverse e vengono indicizzate. – Shamik

Problemi correlati