我有一个Android应用,可以输出每秒数百行的csv。每行的时间戳基本上都是这样生成的:
String formatTimeStamp (Calendar cal)
{
SimpleDateFormat timeFormatISO = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss")
return timeFormatISO.format(cal.getTime());
}
有些时间戳(可能是千分之一)中有意外的零,看起来像这样:
2016-04-12T09:0011:30
2016-04-12T0009:0011:30
2016-04-0012T09:11:30
这些事件似乎完全是武断的,至少 我没有看到他们背后的任何模式。有时在两条错误的行之间有几千行,有时只有一行。
日期格式仅在代码中的一个位置定义。
编辑:
是我上一次运行的错误时间戳,只是为了让你看看它。我唯一注意到的是它在日期元素前总是两个前导零,但从来没有在今年之前。
编辑2:
问题解决了!事实证明SimpleDateFormat不是线程安全的,如果使用不正确,它会对字符串产生奇怪的影响。我不知道多线程是一个问题,所以我没有在最初的问题中指出它。对此感到抱歉。
答案 0 :(得分:1)
“原来SimpleDateFormat不是线程安全的,如果使用不正确,会对字符串产生奇怪的影响。”
您在问题中向我们展示的代码是线程安全的,除非以非安全的方式处理cal
的值。
SimpleDateFormat
实例是线程限制的;即没有其他线程可以看到它。因此,其线程安全性或其他方面无关紧要。
我的猜测是,在您的实际代码中,您有多个线程尝试共享SimpleDateFormat
实例。 javadoc说:
“建议为每个线程创建单独的格式实例。如果多个线程同时访问格式,则必须在外部进行同步。”
答案 1 :(得分:0)
您需要在输入字符串中指定时区。 例如 : timeFormatISO.setTimeZone(TimeZone.getTimeZone(" GMT&#34));