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
+ "***********************************************");
}}
4 回答

互换的青春
TA贡献1797条经验 获得超6个赞
这是一个常识,即SimpleDateFormat 并不是线程安全的,尽管其看起来很像是线程安全的。 有人讨论过设计的“坏味道”,提到过SimpleDateFormat的设计。实际上时区是作为对象的属性共享的,导致其线程不安全的问题,可以参考其Javadoc的说明。

陪伴而非守候
TA贡献1757条经验 获得超8个赞
把第31行的代码
format.setTimeZone(zone);
提到30行就一样了,时区放到上面。
这个跟静态其实关系不大,而是你在格式化之前要把SimpleDateFormat 的时区设定好。而不是格式化之后在设定时区

慕仙森
TA贡献1827条经验 获得超8个赞
我已经知道是何原因了,我SimpleDateFormat 是静态的,然后第一次调用的时候把时区设置成北京后,后面的就全是北京时区了。在utcToTimeZoneDate 返回前把时区设置成默认的就没问题了
添加回答
举报
0/150
提交
取消