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

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

是否有FastDateFormat的替代品,可以FastDateFormat即用,比SimpleDateFormat快得多?

我相信FastDateFormat是速度更快的之一,所以任何速度都快的东西都可以。

好奇,任何想法为什么FastDateFormat不支持解析? 它是否严重限制其使用?

最好的猜测是,保持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更快。

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

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

在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设置一个单独的实例。

UPDATE

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

你真的需要快速解析日期吗? 您是否测试过SimpleDateFormat并发现它对您的需求来说太慢了?

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