2010-12-27 7 views
21

Ben consapevoli delle prestazioni e problemi di thread con SimpleDateFormat, ho deciso di andare con FastDateFormat, fino a quando ho capito che FastDateFormat è solo per la formattazione, senza analisi!Alternative a FastDateFormat per un'analisi efficiente della data?

Esiste un'alternativa a FastDateFormat, pronta per l'uso immediato e molto più veloce di SimpleDateFormat?

Credo che lo FastDateFormat sia uno dei più veloci, quindi tutto ciò che è più veloce sarebbe.

Solo curioso, qualche idea del perché FastDateFormat non supporta l'analisi? Non limita seriamente il suo uso?

+4

Nota: A partire da lang 3.2, questa domanda e risposta sono ormai obsolete. – Barett

risposta

18

Ad una buona ipotesi, è per mantenere FastDateFormat ... beh ... veloce, limitandolo alla sola visualizzazione.

Apache Commons DateUtils ha una funzione parseDate, ma quella utilizza SimpleDateFormat internamente.

Un'alternativa è utilizzare la libreria JodaTime. È un sostituto completo per la gestione degli oggetti DateFormat, Date e Calendar.

JodaTime ha un DateTimeFormatter che può essere utilizzato per creare oggetti DateTime (l'equivalente di JodaTime Date oggetti di Java) da stringhe.

Un esempio di come usarlo è come questo:

String strInputDateTime = "2010-12-27"; // An example, this would really come from outside 
DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyy-MM-dd"); 
DateTime dt = fmt.parseDateTime(strInputDateTime); 

Non so se questo è davvero più veloce di quanto SimpleDateFormat, però.

+4

Nota: A partire da lang 3.2, questa domanda e risposta sono ora obsolete. – Barett

+0

È indulgente o * non indulgente *? –

1

Hai davvero bisogno di analizzare rapidamente le date? Hai testato SimpleDateFormat e l'hai trovato troppo lento per le tue esigenze?

Nota, esistono diversi modi per memorizzare le istanze di classe lente a costrutto lento, non thread-thread (ad esempio ThreadLocal, pool).

+0

Mi rendo conto che ci sono alcune tecniche che implicano il pooling o il multi-threading, ma sto cercando qualcosa dallo scaffale. –

+0

E la mia altra domanda? hai confermato che SimpleDateFormat è troppo lento per le tue esigenze? – jtahlborn

+0

+1 per ThreadLocal e "hai davvero bisogno di prestazioni qui". –

2

Il "problema" con SimpleDateFormat non è le prestazioni, la sua sicurezza thread.

Se si dispone di migliaia di thread e la sincronizzazione non è un uso problema sincronizzato (si può anche riunire le istanze per alleviare questo un po ')

Se si dispone di una quantità ragionevole di discussioni il metodo consigliato è quello di avere un istanza separata per ogni SimpleDateFormat.

+0

Poiché SimpleDateFormat è thread-safe, è necessario creare una nuova istanza o sincronizzare l'accesso simultaneo a un'istanza condivisa. In entrambi i casi è piuttosto lento. Questo è quello che intendevo per problema di prestazioni. –

+0

Dipende dalla situazione, ma se ne hai solo bisogno (è per questo che suppongo tu abbia bisogno di una versione thread-safe), puoi istanziarne una nuova all'inizio di ogni thread e riutilizzare la stessa all'interno di quel thread. Se sono stati inizializzati migliaia di thread, i sovraccarichi di creazione di un thread sono molto più elevati rispetto alla creazione dell'istanza dell'oggetto SimpleDateFormat effettiva. – jbx

+0

Semplice: usa sempre ThreadLocal con SimpleDateFormat. (http://download.oracle.com/javase/6/docs/api/java/lang/ThreadLocal.html) –

9

Trovato qualcosa di interessante qui di questo caso in Android: http://andmob.wikidot.com/faq-simpletimeformat

SimpleDateFormat, la prima volta che si tenta parsing (o, presumibilmente, formattazione) una data, verrà caricato in tutta i dati fuso orario per il tuo locale. Questo richiederà 2-3 secondi. È sperato che questo sarà risolto in qualche edizione futura di Android di .

Nel frattempo, è possibile utilizzare AsyncTask a "riscaldare" SimpleDateFormat nel vostro processo prima di bisogno. È sufficiente analizzare la data in AsyncTask doInBackground() per caricare i fusi orari in un momento in cui non incide così tanto sull'utente . Una volta inizializzato nel processo , SimpleDateFormat eseguirà rapidamente fino a quando il processo non sarà terminato con .

+3

Questo è interessante, +1 per quello! Ma questo problema è specifico per Android e leggermente fuori tema, vero? –

19

Si noti che dal comando commons-lang 3.2, FastDateFormat supporta l'analisi e la stampa.

See: http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/time/FastDateFormat.html

+0

sorpresa a sorpresa, Apache ha anche FastDateParser per l'analisi – ahaaman

+1

Ho scoperto dolorosamente che l'analisi è case sensitive. (10 gennaio 10, 10 gennaio 10 no). Il bug è stato risolto in 3.4 ma al momento di questo commento non sono ancora pubblicato o in Maven. Non vedo l'ora. https://issues.apache.org/jira/browse/LANG-996 – borjab

+0

Potrei sbagliarmi ma dal 3.4 sembra che non ci sia modo di impostare la proprietà _lenient_ di FastDateParser su ** false **. – ptha

5

Come di Java 8, si può usare DateTimeFormatter insieme con la la Java 8 Time API ad entrambi analizzare e formattare date. Dalla documentazione:

Questa classe è immutabile e thread-safe.

Si consiglia di utilizzare questa classe, se possibile, per il nuovo lavoro in avanti anziché utilizzare SimpleDateFormat.