2

我正在尝试"yyyy-MM-dd'T'HHmmssZZ"在我的应用程序中转换为 unix 时间。这是我的代码:

public String getCreatedAt() {
    String formattedCreatedAt = twitterCreatedAt.replace(":", "");
    SimpleDateFormat dateFormat = new SimpleDateFormat(
            "yyyy-MM-dd'T'HHmmssZZ");
    try {
        formattedCreatedAt = Long.toString(dateFormat.parse(formattedCreatedAt).getTime());
        formattedCreatedAt = formattedCreatedAt.substring(0, formattedCreatedAt.length() - 3);
    } catch (ParseException e1) {
        e1.printStackTrace();
        return "0";
    }
    return formattedCreatedAt;

}

我的(奇怪的)问题是,当设备是英文时,一切正常,但是当我在带有 android 2.3.6 的 Galaxy s2 中将设备语言更改为西班牙语时,代码行formattedCreatedAt = Long.toString(dateFormat.parse(formattedCreatedAt).getTime()); 需要更多时间来处理。为什么会这样?谢谢!

这是需要很长时间的部分:

dateFormat.parse(formattedCreatedAt);
4

1 回答 1

2

根据这个网站

SimpleDateFormat,当您第一次尝试解析(或者可能是格式化)日期时,将加载您所在地区的所有时区数据。这将需要 2-3 秒。希望这将在未来的 Android 版本中得到修复。

在此期间,请考虑在需要之前使用 AsyncTask 在您的流程中“预热” SimpleDateFormat。只需在 AsyncTask doInBackground() 中解析一些日期,让它在不会对用户产生太大影响的时候加载时区。一旦在您的进程中初始化,SimpleDateFormat 将快速运行,直到您的进程终止。

有一个未解决的问题,您可以找到解释:

这是由于时区字符串的延迟初始化。只有第一个电话需要这么长时间。如果之后再次使用 SimpleDateFormat,它会从缓存中加载,并且不再需要那么长时间。

在此更改之前,它是在加载类时完成的,因此活动的开始花费了 2-3 秒的时间。与第一次实际使用时花费几秒钟相比,这对用户体验的影响要严重得多。问题是,由于 SimpleDateFormat api 的设计,目前无法规避此问题。只有更快的手机才能通过花费更少的时间来收集这些字符串来解决这个问题。

缓存发生在 SimpleDateFormat 正在使用的 DateFormatSymbols 中。通过重用该实例,可能只需要加载一次 stings(对于相同的 loale)。您还可以在活动启动时在线程中创建该实例,以便它在使用后已经被缓存。要初始化字符串,只需调用 .hashCode() 即可强制初始化缓存。更快但不那么简单的方法是序列化实例。这也强制缓存被初始化。

由于这仅在您的函数第一次被调用时发生(由于时区字符串的初始化),我建议(正如他们所说)使用 anAsyncTask来“预加载” SimpleDateFormat. 我认为它会解决你的问题。

于 2013-06-10T08:49:55.430 回答