Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java FastDateFormat的替代方案,用于高效的日期解析?_Java_Performance_Parsing_Date - Fatal编程技术网

Java FastDateFormat的替代方案,用于高效的日期解析?

Java FastDateFormat的替代方案,用于高效的日期解析?,java,performance,parsing,date,Java,Performance,Parsing,Date,我很清楚SimpleDateFormat的性能和线程问题,我决定使用FastDateFormat,直到我意识到FastDateFormat只用于格式化,不用于解析 是否有一种替代FastDateFormat的方法,可以随时使用,并且比SimpleDateFormat快得多 我相信FastDateFormat是其中一种速度更快的格式,所以任何速度差不多的东西都可以 只是好奇,你知道为什么FastDateFormat不支持解析吗?它是否严重限制了它的使用?您真的需要如此快速地解析日期吗?您是否测试过

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

是否有一种替代
FastDateFormat
的方法,可以随时使用,并且比
SimpleDateFormat
快得多

我相信
FastDateFormat
是其中一种速度更快的格式,所以任何速度差不多的东西都可以


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

您真的需要如此快速地解析日期吗?您是否测试过SimpleDataFormat,发现它对于您的需求来说太慢了


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

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

apachecommons
DateUtils
有一个
parseDate
函数,但在内部使用了
SimpleDateFormat

另一种选择是使用该库。它完全替代了处理
DateFormat
Date
Calendar
对象

JodaTime有一个可用于从字符串创建对象(JodaTime相当于Java的
Date
objects)的

如何使用它的示例如下:

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);

我不知道这是否真的比SimpleDataFormat快。

SimpleDataFormat的“问题”不是性能,而是线程安全性

如果您有数千个线程,并且同步不是一个问题,请使用synchronized(您还可以将实例池在一起,以稍微缓解这一问题)

如果您有合理数量的线程,建议的方法是为每个SimpleDataFormat单独提供一个实例

更新


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

在Android中发现了一些有趣的情况:

SimpleDateFormat,第一次 尝试解析(或者,大概, 格式化)日期,将加载到所有 区域设置的时区数据。 这将需要2-3秒。它是 希望这将在某些方面得到解决 Android的未来版本

在此期间,考虑使用 将任务设置为“预热” 流程中的SimpleDataFormat 在你需要它之前。只需解析一些 AsyncTask doInBackground()中的日期 让它加载时区 有时它不会影响 用户太多了。一旦在您的 进程,SimpleDataFormat将运行 快速完成您的流程 终止


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

请参阅:

从Java8开始,可以使用with the解析和格式化日期。从文件中:

这个类是不可变的,并且是线程安全的


如果可能的话,建议在新的工作中使用此类,而不是使用SimpleDataFormat。

因为SimpleDataFormat是线程不安全的,所以您需要创建一个新实例或同步对共享实例的并发访问。这两种方式都很慢。这就是我所说的性能问题。这取决于你的情况,但如果你只需要一个(这就是为什么我认为你需要一个线程安全的版本),你可以在每个线程的开头实例化一个新的,并在该线程中重用同一个。如果有数千个线程正在初始化,那么创建线程的开销要比创建实际的SimpleDataFormat对象实例高得多。简单:始终将ThreadLocal与SimpleDataFormat一起使用。()如果您在web容器中运行,那么您需要注意ThreadLocals的使用:@michaelok AFAICT,TL可以以安全的方式使用,但是它是。我意识到有些技术涉及池或多线程,但我正在寻找现成的技术。我的另一个问题呢?您确认过SimpleDataFormat对于您的需要来说太慢了吗?+1表示ThreadLocal和“您真的需要这里的性能吗”。SimpleDataFormat非常慢,如果您想进行密集的日期格式和解析,例如将大对象树序列化为JSON字符串。SimpleDataFormat在内部使用的StringBuffer不是最优的。这很有趣,+1!但这个问题是Android特有的,有点离题,不是吗?令人惊讶的是,Apache也为parsingI提供了FastDateParser,parsingI痛苦地发现解析是区分大小写的。(2010年1月10日工程,2010年1月10日编号)。该错误在3.4中已修复,但在发表此评论时,我还没有在Maven中实现。期待着它。我可能是错的,但是从3.4开始,似乎没有办法将FastDateParser的lenient属性设置为false。注意:从lang 3.2开始,这个问题和答案现在已经过时了。这是lenient还是NonLenient?从Java 8开始,您应该使用默认的
DateTimeFormatter
而不是
JodaTime
。(新的Java8时间API主要由
JodaTime
的作者设计)注意:从Lang3.2开始,这个问题和答案现在已经过时了。