FastDateFormat的替代方法可以进行有效的日期解析吗?

时间:2010-12-27 20:35:05

标签: java performance parsing date

很清楚SimpleDateFormat的性能和线程问题,我决定使用FastDateFormat,直到我意识到FastDateFormat仅用于格式化,不进行解析!

是否有FastDateFormat的替代方案,可以立即使用并且比SimpleDateFormat快得多?

我相信FastDateFormat是速度较快的之一,所以任何事情都会快得多。

好奇,知道为什么FastDateFormat不支持解析?它是否严重限制其使用?

6 个答案:

答案 0 :(得分:20)

请注意,由于commons-lang 3.2,FastDateFormat支持解析和打印。

请参阅:http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/time/FastDateFormat.html

答案 1 :(得分:19)

最好的猜测是,保持FastDateFormat ......好吧......快,将其限制为仅显示。

Apache Commons DateUtils有一个parseDate函数,但在内部使用SimpleDateFormat

另一种方法是使用JodaTime库。它完全取代了处理DateFormatDateCalendar个对象。

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更快。

答案 2 :(得分:9)

在Android中发现了一些有趣的案例: http://andmob.wikidot.com/faq-simpletimeformat

  

SimpleDateFormat,这是你第一次   尝试解析(或者,据推测,   格式化一个日期,将加载所有   您的语言环境的时区数据。   这将需要2-3秒。它是   希望这将在某些方面得到修复   未来的Android版本。

     

在此期间,请考虑使用   AsyncTask“热身”   您的流程中的SimpleDateFormat   在你需要它之​​前。只是解析一些   AsyncTask中的日期doInBackground()   让它加载时区   有时它不会影响   用户这么多。一旦在你的网站初始化   进程,SimpleDateFormat将运行   很快,直到你的过程   终止。

答案 3 :(得分:6)

从Java 8开始,可以使用DateTimeFormatterJava 8 Time API来解析和格式化日期。来自文档:

  

此类是不可变且线程安全的。

如果可能的话,建议使用此类进行新的工作,而不是使用SimpleDateFormat。

答案 4 :(得分:3)

SimpleDateFormat的'问题'不是性能,它的线程安全。

如果您有数千个线程并且同步不是问题,请使用synchronized(您也可以将实例池化以缓解此问题)

如果您有合理数量的线程,建议的方法是为每个SimpleDateFormat设置一个单独的实例。

<强>更新

从Java 8开始,只需使用DateTimeFormatter即可。它是不可变的,线程安全的,更快的,更灵活的。 (它还提供了很好的功能,如ISO-8601日期/时间字符串的默认模式。)

答案 5 :(得分:1)

您真的需要快速解析日期吗?您是否测试过SimpleDateFormat并发现它太慢而无法满足您的需求?

注意,有多种方法可以缓存慢速构造,非线程安全的类实例(例如ThreadLocal,池)。