包含时区时,SimpleDateFormat需要太长的时间

我正在使用这个简单的date格式

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS Z"); 

问题是当我使用这个需要太长的时间来转换,在logcat我看到这样的事情

 I/Resources( 4284): Loaded time zone names for en in 272ms. I/Resources( 4284): Loaded time zone names for en in 194ms. I/Resources( 4284): Loaded time zone names for en in 112ms. I/Resources( 4284): Loaded time zone names for en in 111ms. I/Resources( 4284): Loaded time zone names for en in 113ms. I/Resources( 4284): Loaded time zone names for en in 127ms. I/Resources( 4284): Loaded time zone names for en in 253ms. I/Resources( 4284): Loaded time zone names for en in 110ms. I/Resources( 4284): Loaded time zone names for en in 154ms. I/Resources( 4284): Loaded time zone names for en in 112ms. 

我怎样才能使用简单的dateformater,但加快速度,我不想采取约150ms的每个转换…

有人有这个问题吗?

Solutions Collecting From Web of "包含时区时,SimpleDateFormat需要太长的时间"

这是由于时区区域string的延迟初始化。 只有第一个电话会花这么长时间。 如果SimpleDateFormat之后再被使用,它将从caching加载,不应该再花那么久了。

在这个改变之前,当class级被加载完毕,活动的开始花费了2-3秒的时间。 这对用户体验的影响要比第一次实际使用时花费的时间要多得多。 问题在于,由于SimpleDateFormat api的devise,现在没有办法绕过这个问题。 只有更快的电话才能解决这个问题,只需花费更less的时间来收集这些string

caching发生在SimpleDateFormat正在使用的DateFormatSymbols中。 通过重用这个实例,可能只需要加载一次(针对同一个loale)。 您也可以在活动启动时在线程中创build该实例,以便在使用该实例时将其caching。 要初始化string,只需调用强制初始化caching的.hashCode()。 更快一点但不那么简单的是序列化实例。 这也强制高速caching被初始化。

在此期间,在您需要之前,请考虑使用AsyncTask在您的进程中“预热”SimpleDateFormat。 只需在AsyncTask doInBackground()中parsing某个date,以便在不会对用户造成太大影响的情况下加载时区。 一旦在您的过程中初始化,SimpleDateFormat将快速运行,直到您的过程终止。

这在最近的Android版本上是不正确的(从日志消息的文本中可以看出,你运行的是旧版本;现代版本告诉你在花费在icu4c和托pipe代码上的时间)。 请注意,“Pulkit Goyal”的答案是从http://code.google.com/p/android/issues/detail?id=3147复制并粘贴的,文字是指甜甜圈 。 自那以后我重写了这个代码几次。 目前,en_US和系统的默认语言环境(在引导时)被caching在zygote中。 还有一个每个应用程序caching,所以对于其他语言环境,您只应该支付一次。

现代版本中最糟糕的情况是用户更改系统的默认语言环境。 这将需要重启zygote(一个“运行时重启”或重启),以获得新的默认语言环境的时区stringcaching在zygote他们可以共享。 (我在这个bug的评论11中描述了这个行为,它随ICS一起提供。)