[code="java"]
package com.sunsheen.dataimport;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
public class Demo {
private static SimpleDateFormat format = new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss");
private static TimeZone zone = TimeZone.getTimeZone("Asia/Beijing");
public static void test() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Date date = null;
try {
date = sdf.parse(utcToTimeZoneDate("2014-07-31 01:00:00"));
} catch (ParseException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
System.out.println(date
+ "------------------------------------------------");
}
public static String utcToTimeZoneDate(String date) {
Date timeStart;
String beijing = null;
try {
timeStart = format.parse(date);
format.setTimeZone(zone);
beijing = format.format(timeStart);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return beijing;
}
public static void main(String[] args) throws ParseException {
test();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Date date = null;
try {
date = sdf.parse(utcToTimeZoneDate("2014-07-31 01:00:00"));
} catch (ParseException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
System.out.println(date
+ "***********************************************");
}
}
[/code]
这是一个常识,即SimpleDateFormat 并不是线程安全的,尽管其看起来很像是线程安全的。 有人讨论过设计的“坏味道”,提到过SimpleDateFormat的设计。实际上时区是作为对象的属性共享的,导致其线程不安全的问题,可以参考其Javadoc的说明。
把第31行的代码
format.setTimeZone(zone);
提到30行就一样了,时区放到上面。
应该是时区影响的,具体原因也不是特别清楚,正在查询资料,看是否能找到答案