gpt4 book ai didi

java - DateFormat 或 Calender.getInstance 有时会返回随机值

转载 作者:行者123 更新时间:2023-11-29 08:42:05 25 4
gpt4 key购买 nike

now() 的以下代码针对一个对象执行了两次。一次表示它的创建,另一次表示它何时写入数据库。

在受控测试中,我设法可靠地重现了日期彼此之间差异很大的错误。有些日期似乎有正确的日期,但在 00:00:00 或接近 00:00:00

其他人似乎相对偏离了几个小时,从 1 小时到 16 小时甚至几周不等。我也有时间设定在未来。 Calendar.getInstance.getTime() 应该等同于 System.getCurrentTimeMillis(),让后者偶尔返回一个 future 时间有点令人担忧。

我还没有发现任何问题,我打算进一步调查这个问题并在此处报告我的发现。

private static DateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");

public static String calendarToDb(Calendar cal) {
if (cal == null) {
return null;
}
return simpleDateFormat.format(cal.getTime());
}

public static String now() {
return calendarToDb(Calendar.getInstance());
}

这是来自 android-monitor 的日志的相关部分。这是一个真实的设备,而不是模拟器。 M 代表 MessageManager,P 代表 ContentProvider

08-30 18:07:17.267 M: main             starttime  = 2016-01-01T00:07:00+0100\
08-30 18:07:17.306 P: AsyncQueryWorker CreateTime = 2016-08-30T18:07:17+0200\
08-30 18:07:18.326 M: main starttime = 2016-01-01T00:00:00+0200\
08-30 18:07:18.371 P: AsyncQueryWorker CreateTime = 2016-08-30T18:07:18+0200\
08-30 18:07:19.898 M: main starttime = 2016-08-30T18:07:19+0200\
08-30 18:07:19.920 P: AsyncQueryWorker CreateTime = 2016-08-30T00:00:00+0100\

我的数据库中有更多看起来更奇怪的数据,根本不应该发生。

最佳答案

问题似乎最有可能出在静态

static DateFormat simpleDateFormat

正如此处所解释的: Why is Java's SimpleDateFormat not thread-safe?

存储中间结果,如果多个线程使用同一个实例(它们这样做是因为静态)。时间可以在方法执行过程中部分重置,这会扭曲当前处理的结果。

解决方案是每次都返回新的实例。

关于java - DateFormat 或 Calender.getInstance 有时会返回随机值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39251847/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com