【问题标题】:Java parsing some dates incorrectly even though they're validJava 错误地解析了一些日期,即使它们是有效的
【发布时间】: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 变量对其进行了排序。现在似乎按预期工作。

标签: java android date


【解决方案1】:

您应该使用semaphore 来控制线程访问

Semaphore

【讨论】:

  • 不,最好在每个线程中简单地创建一个新的SimpleDateFormat。这两个线程在逻辑上并没有处理共享的可变数据——这只是SimpleDateFormat 的线程不安全性质导致了问题。线程之间不需要协调。
猜你喜欢
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-10
  • 1970-01-01
  • 1970-01-01
  • 2020-06-19
相关资源
最近更新 更多