JAVA 8 中重新安排了对时间的处理,但是项目中还是有很多地方用到老的API,今天用了项目中一个工具类,结果又被时区坑了一把。主要原因还是对API不熟悉导致的,现在将问题记录如下。
问题是这样的, 我要把一个String 转成Date类型,这个时候就要用到SimpleDateFormat 这个类了,为了项目的可维护性,我找了之前工具类里定义的一个SimpleDateFormat类,而且还是ThreadLocal,感觉很科学。但是当我查看Parse出来的Date的值时,却发现时间被加了8小时。嗯.....,又是时区问题。昨天刚花时间研究了一番JAVA 8时间API的我感觉又被安排了。
百思不得其解,我就搜索了一把SimpleDateFormat 和 时区, 在一个网页我看到了这样一段代码
SimpleDateFormat f1 =new SimpleDateFormat("yyyy-MM-dd");
f1.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
WTF! (阿弥陀佛)SimpleDateFormat还能设置时区!后来想想其实这是很正常的,因为Date本来是一个带有时区的时间,那么从String变成Date的过程肯定有一个指定时区的过程,如果不指定,肯定有一个默认值。
那么这样一来的话,肯定有一个地方设置了SimpleDateFormat的时区,由于它又是ThreadLocal,所以会影响到所有地方。我到那个工具类里搜索了一把,果然在一个不起眼的地方设置了0时区(错误的编程示范)。
到这里虽然知道这个时间为什么被改掉了,但是还是有奇怪的地方。SimpleDateFormat转出来的时间虽然变成了0时区,但是为啥输出的时间就会加8小时呢。这是因为Date的toString方法会默认将时间转成当前时区(有副作用的方法)。
还是应该用JAVA 8 的时间啊!有时区没时区明明白白。