SimpleDateFormat使用不当导致时间错乱
近期一个老项目发现导入数据(节目单),存在时间错乱的问题。节目单来自文件,文件格式大概:
中央五套.txt
?
??
而上面的parse(source,pos)则是使用实现类的方法,这里即SimpleDateFormat.parse(source,pos)方法,它的代码就不贴了,但可以明显的发现SimpleDateFormat继承自DateFormat的Calendar calendar,在private int subParse(String text, int start, int patternCharIndex, int count,
? ? ? ? ? ? ? ? ? ? ? ? ?boolean obeyCount, boolean[] ambiguousYear,
? ? ? ? ? ? ? ? ? ? ? ? ?ParsePosition origPos) 方法中,会解析传入的source,并依次将解析出的yyyy,MM,dd,HH,mm,ss设置到calendar中,由于calendar在这是实例变量,所以在多线程的情况下就会造成数据串的情况,接下来写个测试类来模拟:
?
?
??
运行代码后,基本都能重现几十次并发问题,如下(部分)运行结果:
?
2: 原:2012-02-02 12:12:12 新:2012-02-30 12:12:121: 原:2012-03-30 12:12:12 新:2012-03-02 12:12:1220: 原:2012-02-02 12:12:12 新:2012-02-30 12:12:1217: 原:2012-03-30 12:12:12 新:2012-03-02 12:12:1248: 原:2012-02-02 12:12:12 新:2012-02-30 12:12:1242: 原:2012-02-02 12:12:12 新:2012-02-30 12:12:1240: 原:2012-02-02 12:12:12 新:2012-02-30 12:12:1234: 原:2012-02-02 12:12:12 新:2012-02-30 12:12:12??
如上,就出现了2012-02-30 这样错误的时间。
?
?
?