Java SimpleDateFormat添加随机零

时间:2016-04-12 12:27:58

标签: java simpledateformat

我有一个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

这些事件似乎完全是武断的,至少 我没有看到他们背后的任何模式。有时在两条错误的行之间有几千行,有时只有一行。

日期格式仅在代码中的一个位置定义。

编辑:

Here

是我上一次运行的错误时间戳,只是为了让你看看它。我唯一注意到的是它在日期元素前总是两个前导零,但从来没有在今年之前。

编辑2:

问题解决了!事实证明SimpleDateFormat不是线程安全的,如果使用不正确,它会对字符串产生奇怪的影响。我不知道多线程是一个问题,所以我没有在最初的问题中指出它。对此感到抱歉。

2 个答案:

答案 0 :(得分:1)

  

“原来SimpleDateFormat不是线程安全的,如果使用不正确,会对字符串产生奇怪的影响。”

您在问题中向我们展示的代码是线程安全的,除非以非安全的方式处理cal的值。

SimpleDateFormat实例是线程限制的;即没有其他线程可以看到它。因此,其线程安全性或其他方面无关紧要。

我的猜测是,在您的实际代码中,您有多个线程尝试共享SimpleDateFormat实例。 javadoc说:

  

“建议为每个线程创建单独的格式实例。如果多个线程同时访问格式,则必须在外部进行同步。”

答案 1 :(得分:0)

您需要在输入字符串中指定时区。 例如 : timeFormatISO.setTimeZone(TimeZone.getTimeZone(" GMT&#34));