开发跨地域的程序时,常需要进行时区转换,一个设计优良的系统,也必须考虑对多时区的支持。
前段时间,因为公司的一个应用程序的需求,需要开发一个taglib来判断时区,并根据时区来进行时间的转换。需求原文如下:
最终效果:<web-sol:dateTime datetime="2011-07-05 17:20:30 Asia/Shanghai" targettimezone="America/New_York" format="yyyy-MM-dd HH:mm:ss"></web-sol:dateTime> 当我在JSP页面引入这段代码,就会自动将datetime转换为targettimezone时区的时间。当然,为了方便大家看明白,这里都是hashcode的数据。
查了很多资料,都说的不是很明白。好吧,自己动手。
至于开发标签的流程,这里就不讲了。就只说说时区的转换问题。
第一次开发如下:
TimeZone timeZoneSH = TimeZone.getTimeZone(
"Asia/Shanghai"
);
TimeZone timeZoneNY = TimeZone.getTimeZone(
"America/New_York"
);
String datetime = "2011-07-05 17:20:30";
DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date localDate = format.parse(time);
int deffTime = timeZoneSH.getRawOffset() - timeZoneNY.getRawOffset() ;//通过时区来相减
long nowTime = localDate .getTime();
long newNowTime = nowTime - deffTime;
Date zoneDate = new Date(newNowTime); //转换后的时间System.out.println("Asia/Shanghai:" + localDate );
System.out.println("America/New_York:" + zoneDate );
应该说,这样就完成了,但是,测试的时候出现了问题。转化成有的时区后,时间始终要相差那么一个小时。而有的时区则不会。为什么呢?
:夏时令
就是说有些国家到了夏天会将时间拨快一个小时,比如美国。
怎么解决呢?令人高兴的是,JDK(or JRE)已自动为我们进行了夏令时处理。
String inputDate = "2011-05-14 23:30:00";
TimeZone timeZoneSH = TimeZone.getTimeZone("Asia/Shanghai");
TimeZone timeZoneNY = TimeZone.getTimeZone("America/New_York");
SimpleDateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
inputFormat.setTimeZone(timeZoneSH);
Date date = null;
try
{
date = inputFormat.parse(inputDate);
}
catch (ParseException e)
{
}
SimpleDateFormat outputFormat = new SimpleDateFormat("EEE MMM d HH:mm:ss Z yyyy", Locale.US);
outputFormat.setTimeZone(timeZoneSH);
System.out.println("Asia/Shanghai:" + outputFormat.format(date));
outputFormat.setTimeZone(timeZoneNY);
System.out.println("America/New_York:" + outputFormat.format(date));
终于搞定,哈哈,试一试吧。