SimpleDateFormat
はパフォーマンスとスレッドの問題をよく認識しているので、FastDateFormat
はフォーマットのみであり、解析ではないことに気づくまで、FastDateFormat
を使用することにしました。
FastDateFormat
に代わるものはありますか。すぐに使用でき、SimpleDateFormat
よりはるかに高速です。
私はFastDateFormat
が最も速いものの1つであると考えています。
好奇心旺盛ですが、FastDateFormat
が解析をサポートしない理由はありますか?使用を真剣に制限していませんか?
おそらく、表示のみに制限することで、FastDateFormatを高速に維持することです。
Apache Commons DateUtils
にはparseDate
関数がありますが、内部ではSimpleDateFormat
を使用します。
別の方法は、 JodaTime ライブラリを使用することです。 DateFormat
、Date
、および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
より速いかどうかはわかりません。
Commons-lang 3.2以降、FastDateFormatは解析だけでなく印刷もサポートしています。
Androidでこのケースの興味深いものが見つかりました: http://andmob.wikidot.com/faq-simpletimeformat
SimpleDateFormatは、日付の解析(またはおそらくはフォーマット)を初めて試みたときに、ロケールのすべてのタイムゾーンデータをロードします。これには2〜3秒かかります。この問題は、Androidの将来のエディションで修正される予定です。
暫定的には、AsyncTaskを使用して、必要になる前にプロセス内でSimpleDateFormatを「ウォームアップ」することを検討してください。 AsyncTask doInBackground()で日付を解析して、ユーザーにそれほど影響を与えない時間帯にタイムゾーンをロードするだけです。プロセスで初期化されると、SimpleDateFormatはプロセスが終了するまですばやく実行されます。
Java 8以降、 DateTimeFormatter と Java 8 Time API を併用して日付を解析およびフォーマットできます。ドキュメントから:
このクラスは不変であり、スレッドセーフです。
SimpleDateFormatを使用する代わりに、今後の新しい作業で可能な場合は、このクラスを使用することをお勧めします。
SimpleDateFormatの「問題」はパフォーマンスではなく、スレッドセーフです。
数千のスレッドがあり、同期が問題ではない場合は、synchronizedを使用します(インスタンスをプールしてこれを少し軽減することもできます)。
妥当な量のスレッドがある場合、推奨される方法は、SimpleDateFormatごとに個別のインスタンスを作成することです。
[〜#〜]更新[〜#〜]
Java 8以降、DateTimeFormatter
を使用してください。これは不変で、スレッドセーフで、高速で、柔軟性があります。(ISO-8601日付のデフォルトパターンなどの素晴らしい機能も提供します/ time文字列。)
本当にすぐに日付を解析する必要がありますか? SimpleDateFormatをテストしましたが、ニーズに対して遅すぎると感じましたか?
構築が遅く、スレッドセーフではないクラスインスタンス(ThreadLocal、プールなど)をキャッシュするには、さまざまな方法があります。