web-dev-qa-db-ja.com

効率的な日付解析のためのFastDateFormatの代替案?

SimpleDateFormatはパフォーマンスとスレッドの問題をよく認識しているので、FastDateFormatはフォーマットのみであり、解析ではないことに気づくまで、FastDateFormatを使用することにしました。

FastDateFormatに代わるものはありますか。すぐに使用でき、SimpleDateFormatよりはるかに高速です。

私はFastDateFormatが最も速いものの1つであると考えています。

好奇心旺盛ですが、FastDateFormatが解析をサポートしない理由はありますか?使用を真剣に制限していませんか?

24
Tom Tucker

おそらく、表示のみに制限することで、FastDateFormatを高速に維持することです。

Apache Commons DateUtilsにはparseDate関数がありますが、内部ではSimpleDateFormatを使用します。

別の方法は、 JodaTime ライブラリを使用することです。 DateFormatDate、およびCalendarオブジェクトを処理するための完全な代替品です。

JodaTimeには DateTimeFormatter を使用して DateTime オブジェクト(JodaTimeのJavaのDateオブジェクトに相当)を作成できます文字列。

使用方法の例は次のとおりです。

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

しかし、これが本当にSimpleDateFormatより速いかどうかはわかりません。

19
Powerlord

Commons-lang 3.2以降、FastDateFormatは解析だけでなく印刷もサポートしています。

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

20
Gareth

Androidでこのケースの興味深いものが見つかりました: http://andmob.wikidot.com/faq-simpletimeformat

SimpleDateFormatは、日付の解析(またはおそらくはフォーマット)を初めて試みたときに、ロケールのすべてのタイムゾーンデータをロードします。これには2〜3秒かかります。この問題は、Androidの将来のエディションで修正される予定です。

暫定的には、AsyncTaskを使用して、必要になる前にプロセス内でSimpleDateFormatを「ウォームアップ」することを検討してください。 AsyncTask doInBackground()で日付を解析して、ユーザーにそれほど影響を与えない時間帯にタイムゾーンをロードするだけです。プロセスで初期化されると、SimpleDateFormatはプロセスが終了するまですばやく実行されます。

9
nhaarman

Java 8以降、 DateTimeFormatterJava 8 Time API を併用して日付を解析およびフォーマットできます。ドキュメントから:

このクラスは不変であり、スレッドセーフです。

SimpleDateFormatを使用する代わりに、今後の新しい作業で可能な場合は、このクラスを使用することをお勧めします。

7
Mike

SimpleDateFormatの「問題」はパフォーマンスではなく、スレッドセーフです。

数千のスレッドがあり、同期が問題ではない場合は、synchronizedを使用します(インスタンスをプールしてこれを少し軽減することもできます)。

妥当な量のスレッドがある場合、推奨される方法は、SimpleDateFormatごとに個別のインスタンスを作成することです。

[〜#〜]更新[〜#〜]

Java 8以降、DateTimeFormatterを使用してください。これは不変で、スレッドセーフで、高速で、柔軟性があります。(ISO-8601日付のデフォルトパターンなどの素晴らしい機能も提供します/ time文字列。)

3
jbx

本当にすぐに日付を解析する必要がありますか? SimpleDateFormatをテストしましたが、ニーズに対して遅すぎると感じましたか?

構築が遅く、スレッドセーフではないクラスインスタンス(ThreadLocal、プールなど)をキャッシュするには、さまざまな方法があります。

1
jtahlborn