【发布时间】:2016-12-07 11:17:42
【问题描述】:
我正在开发的应用程序必须解析大量日期才能执行一些计算。这些是从本地 SQLite 数据库中提取出来的,并在它们转换为 Java 对象时进行解析。这在整个应用程序中运行良好,但在一种情况下会导致一些非常不寻常的行为。
正在加载的屏幕检索到相当多的数据(目前正在测试大约 3k 条记录),并且在解析日期的过程中,其中一些被错误地解析,即使日期字符串本身是完全有效。
解析代码是这样的
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
try {
String dateString = cursor.getString(idx);
Date d = df.parse(dateString);
System.out.println("Parsed " + dateString + " into " + d);
} catch (ParseException ex) {
ex.printStackTrace();
}
这适用于大多数日期,但有几个失败的例子是
Parsed 2016-11-30T10:32:29Z into Wed Nov 30 10:32:28 GMT+00:00 2016
Parsed 2016-11-30T10:48:15Z into Thu Jan 01 01:00:14 GMT+00:00 1970
Parsed 2016-11-30T10:32:30Z into Wed Nov 30 10:32:29 GMT+00:00 2016
Parsed 2016-11-30T10:48:16Z into Fri Jan 01 00:48:15 GMT+00:00 2016
Parsed 2016-11-30T10:32:31Z into Wed Nov 30 10:32:30 GMT+00:00 2016
Parsed 2016-11-30T10:48:17Z into Fri Jan 01 00:48:16 GMT+00:00 2016
Parsed 2016-11-30T10:32:32Z into Wed Nov 30 10:32:31 GMT+00:00 2016
Parsed 2016-11-30T10:32:33Z into Thu Jan 01 01:00:32 GMT+00:00 1970
Parsed 2016-11-30T10:48:18Z into Wed Nov 30 10:48:17 GMT+00:00 2016
如您所见,有许多日期的解析完全不正确,我不知道为什么。
我唯一能想到的就是线程。我有两个后台线程,它们都将同时调用相同的代码,尽管我不明白为什么它们应该相互干扰。
有没有人知道这里发生了什么,因为我现在完全迷路了?
【问题讨论】:
-
您的
df是否在两个线程之间共享?这可以解释它,因为DateFormat不是线程安全的。 -
哇。没有意识到日期格式化程序/解析器之类的东西不是线程安全的。嗯,是时候重构了
-
@JonSkeet 使用包裹日期格式化程序的 ThreadLocal 变量对其进行了排序。现在似乎按预期工作。