FastDateFormat的替代方法可以进行有效的日期解析吗?
我很清楚SimpleDateFormat
的性能和线程问题,我决定使用FastDateFormat
,直到我意识到FastDateFormat
只用于格式化,没有解析!
是否有FastDateFormat
的替代品,可以FastDateFormat
即用,比SimpleDateFormat
快得多?
我相信FastDateFormat
是速度更快的之一,所以任何速度都快的东西都可以。
好奇,任何想法为什么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支持解析和打印。
请参阅: 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,池)。
- Maven Findbugs插件 – 如何在测试类上运行findbug
- Criteria Builder在Select语句中创建新对象
- 使用plexus-compiler-eclipse进行编译时无法解析导入org.omg .CORBA
- org.hibernate.hql.internal.ast.QuerySyntaxException:意外令牌:*靠近第1行
- Eclipse Juno – 为什么在未使用的带注释的私有字段上没有警告?
- 从单个ibatis查询返回多个类型
- 从Java代码发送ssh命令
- 有没有像“(k,v)”那样流式传输地图而不是使用(条目)?
- 从JBoss中的servlet访问Spring bean