Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.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错误地解析某些日期,即使它们是有效的_Java_Android_Date - Fatal编程技术网

Java错误地解析某些日期,即使它们是有效的

Java错误地解析某些日期,即使它们是有效的,java,android,date,Java,Android,Date,我正在开发的一个应用程序必须解析大量的日期才能执行一些计算。它们从本地SQLite数据库中取出,并在转换为Java对象时进行解析。这在整个应用程序中运行良好,但在一个案例中导致了一些非常不寻常的行为 正在加载的屏幕检索相当大的数据测试,目前有~3k条记录,在解析日期的过程中,其中一些数据被错误解析,即使日期字符串本身完全有效 解析代码如下所示 SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); try

我正在开发的一个应用程序必须解析大量的日期才能执行一些计算。它们从本地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不是线程安全的。没有意识到像日期格式化程序/解析器这样的东西不会是线程安全的。啊,好吧,时间到了refactor@JonSkeet使用ThreadLocal变量包装日期格式化程序对其进行排序。现在似乎正在按预期工作。不,最好在每个线程中创建一个新的SimpleDataFormat。这两个线程在逻辑上并没有处理共享的可变数据——只是SimpleDataFormat的线程不安全特性造成了问题。线程之间不需要协调。