web-dev-qa-db-fra.com

Alternatives à FastDateFormat pour une analyse efficace des dates?

Bien conscient des problèmes de performances et de threads avec SimpleDateFormat, j’ai décidé d’utiliser FastDateFormat, jusqu’à ce que j’ai réalisé que FastDateFormat ne soit que pour le formatage, pas d’analyse!

Existe-t-il une alternative à FastDateFormat, prête à l'emploi et beaucoup plus rapide que SimpleDateFormat?

Je crois que FastDateFormat est l’un des plus rapides, donc tout ce qui est à peu près aussi rapide ferait.

Juste curieux, aucune idée pourquoi FastDateFormat ne supporte pas l'analyse syntaxique? Ne limite-t-il pas sérieusement son utilisation?

23
Tom Tucker

Au mieux, c'est de garder FastDateFormat ... eh bien ... rapidement, en le limitant à l'affichage uniquement.

Apache Commons DateUtils a une fonction parseDate, mais utilise SimpleDateFormat en interne.

Une alternative consiste à utiliser la bibliothèque JodaTime . C'est un remplacement complet pour le traitement des objets DateFormat, Date et Calendar.

JodaTime a un DateTimeFormatter qui peut être utilisé pour créer DateTime objects (l'équivalent de JodaTime des objets Date de Java) à partir de chaînes.

Voici un exemple d'utilisation:

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

Je ne sais pas si c'est vraiment plus rapide que SimpleDateFormat, cependant.

19
Powerlord

Notez que depuis commons-lang 3.2, FastDateFormat prend en charge l’analyse ainsi que l’impression.

Voir: http://commons.Apache.org/proper/commons-lang/apidocs/org/Apache/commons/lang3/time/FastDateFormat.html

20
Gareth

J'ai trouvé quelque chose d'intéressant dans cette affaire sous Android: http://andmob.wikidot.com/faq-simpletimeformat

SimpleDateFormat, la première fois que vous Essayez d’analyser (ou vraisemblablement, Le formatage) une date, chargera dans toutes les Les données de fuseau horaire de votre région. prendra 2-3 secondes. Nous espérons que ce problème sera résolu dans une prochaine édition d'Android.

Entre-temps, envisagez d'utiliser AsyncTask pour "réchauffer" SimpleDateFormat dans votre processus Avant que vous en ayez besoin. Il suffit d’analyser une date de Dans la tâche asynchrone doInBackground () Pour qu’elle charge les fuseaux horaires À un moment où cela n’aura pas autant d’impact sur l’utilisateur . Une fois initialisé dans votre processus , SimpleDateFormat exécutera Rapidement jusqu'à ce que votre processus soit terminé. .

9
nhaarman

À partir de Java 8, vous pouvez utiliser DateTimeFormatter avec l'API Java 8 Time pour analyser et formater les dates. De la documentation:

Cette classe est immuable et thread-safe.

Il est recommandé d'utiliser cette classe si possible pour les nouveaux travaux au lieu d'utiliser SimpleDateFormat.

6
Mike

Le «problème» avec SimpleDateFormat n'est pas la performance, c'est la sécurité des threads. 

Si vous avez des milliers de threads et que la synchronisation n'est pas un problème, utilisez-le de manière synchronisée (vous pouvez également regrouper les instances pour atténuer un peu ce problème).

Si vous avez un nombre raisonnable de threads, la méthode recommandée consiste à avoir une instance distincte pour chaque SimpleDateFormat.

METTRE À JOUR

A partir de Java 8, utilisez simplement DateTimeFormatter. Il est immuable, thread-safe, plus rapide et plus flexible. (Il offre également des fonctionnalités intéressantes comme les modèles par défaut pour les chaînes de date/heure ISO-8601.) 

3
jbx

Avez-vous vraiment besoin d'analyser les dates aussi rapidement? Avez-vous testé SimpleDateFormat et l'avez trouvé trop lent pour vos besoins?

Notez qu'il existe différentes façons de mettre en cache des instances de classe lentes à construire, non compatibles avec les threads (par exemple, les pools ThreadLocal).

1
jtahlborn