很清楚SimpleDateFormat
的性能和线程问题,我决定使用FastDateFormat
,直到我意识到FastDateFormat
仅用于格式化,不进行解析!
是否有FastDateFormat
的替代方案,可以立即使用并且比SimpleDateFormat
快得多?
我相信FastDateFormat
是速度较快的之一,所以任何事情都会快得多。
好奇,知道为什么FastDateFormat
不支持解析?它是否严重限制其使用?
答案 0 :(得分:20)
请注意,由于commons-lang 3.2,FastDateFormat支持解析和打印。
答案 1 :(得分:19)
最好的猜测是,保持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
更快。
答案 2 :(得分:9)
在Android中发现了一些有趣的案例: http://andmob.wikidot.com/faq-simpletimeformat
SimpleDateFormat,这是你第一次 尝试解析(或者,据推测, 格式化一个日期,将加载所有 您的语言环境的时区数据。 这将需要2-3秒。它是 希望这将在某些方面得到修复 未来的Android版本。
在此期间,请考虑使用 AsyncTask“热身” 您的流程中的SimpleDateFormat 在你需要它之前。只是解析一些 AsyncTask中的日期doInBackground() 让它加载时区 有时它不会影响 用户这么多。一旦在你的网站初始化 进程,SimpleDateFormat将运行 很快,直到你的过程 终止。
答案 3 :(得分:6)
从Java 8开始,可以使用DateTimeFormatter和Java 8 Time API来解析和格式化日期。来自文档:
此类是不可变且线程安全的。
如果可能的话,建议使用此类进行新的工作,而不是使用SimpleDateFormat。
答案 4 :(得分:3)
SimpleDateFormat的'问题'不是性能,它的线程安全。
如果您有数千个线程并且同步不是问题,请使用synchronized(您也可以将实例池化以缓解此问题)
如果您有合理数量的线程,建议的方法是为每个SimpleDateFormat设置一个单独的实例。
<强>更新强>
从Java 8开始,只需使用DateTimeFormatter
即可。它是不可变的,线程安全的,更快的,更灵活的。 (它还提供了很好的功能,如ISO-8601日期/时间字符串的默认模式。)
答案 5 :(得分:1)
您真的需要快速解析日期吗?您是否测试过SimpleDateFormat并发现它太慢而无法满足您的需求?
注意,有多种方法可以缓存慢速构造,非线程安全的类实例(例如ThreadLocal,池)。