Java 开发中时区的转换问题

开发跨地域的程序时,常需要进行时区转换,一个设计优良的系统,也必须考虑对多时区的支持。

前段时间,因为公司的一个应用程序的需求,需要开发一个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));
终于搞定,哈哈,试一试吧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值