BO SDK 时间参数和jxl读excel的时区问题



1 当用jxl读取excel的时间值时会吧excel里的时间值和本地系统的时区进行匹配转换,jxl应该读取excel的时间时应该默认为GTM时间

,如果本地时区为+8,则在读取excel的时间后会自动加8小时。

如我在开发机器上的时区为-8,在读取excel里值为‘2013-01-01’的值时会得到‘2012-12-31 16:00:00’。

cell里的内容为2013-01-01,cell format为日期
 if(cell.getType()==CellType.DATE||cell.getType()==CellType.DATE_FORMULA)
 {   DateCell dc=(DateCell)cell;
     Date date=dc.getDate();
     ///这里的date会得到 12年31号的下午4点
。。。。。。。
}
当然希望date变量的值和excel中的值一样,开始我用时区补偿值来重新计算时间,
int timeOffSet=TimeZone.getDefault().getRawOffset()/1000/3600;
Calendar cl=Calendar.getInstance();
cl.setTime(date);
cl.add(Calendar.HOUR,(offset)*-1);
date=cl.getTime();

希望这样子能把date变量重新计算到和excel中一样,当然2013-01-01是没有问题的,但是当excel中的时间为2013-08-31时,按照这样

计算(实际上是+8)后去得到2013-08-31 1:00:00 AM, 居然多出了一个小时。 去掉时间补偿计算,重新答应最开始的date发现当传入

2013-08-31 时得到2013 年8月30号 下午5点,说明时间补偿是-7小时,经查发现原来美国的时区中分为PST 和PDT,2007年起延長夏令時間,開始日期從每年4月的第一個星期日,提前到 3月的第二個星期日,結束日期從每年10月的最後一個星期日,延後到 11月的第一個星期日,他和GMT相差-7小时,其余时间

为-8小时。

所不能够使用上面的系统所在的时区来计算时区补偿值,转而使用date本身的时区补偿,date的时区补偿是以分钟为返回值的,
int offset=date.getTimezoneOffset()/60;
但是发现date的时区补偿不带符号,虽然得出时区的时间补偿为7小时或者8小时但是不知道正的还是负的,但是系统的时区补偿是有符号的所以想着把两者结合起来用,用系统时区补偿值来得出是正值还是负值,用date时间补偿来得出具体的差值。
int timeOffSet=TimeZone.getDefault().getRawOffset()/1000/3600;
int offset=date.getTimezoneOffset()/60;
if(timeOffSet<0)
cl.add(Calendar.HOUR,(offset));
else
cl.add(Calendar.HOUR,(offset)*-1);

至此用jxl读取excel中的时间问题得到解决,但是当把时间的字符转值传入BO SDK的报表的时候发现,其实BO SDK默认处理的时区为标准时区,意味着它会把我传给他的参数和我本地系统的时区计算差值后传给report,同理用以上的办法先预处理传去的值即可,在我的-8的开发系统中就是把传给他的时间参数+8小时,这就保证了和获取的值和excel参数中的值是一样的.


需要注意的是在处理夏令时时间缝隙时要引起注意,比如2013年3月10号2点是美国夏令时的分割点,如果你希望的需要处理的时间是2013-03-10: 00:00:00 你希望加上8个小时希望得到的时间是2013-03-10 08:00:00 ,但是用

cl.add(Calendar.HOUR,8);

得到的结果却是2013-03-10 08:00:00 因为跨过了他的分割点,

如果不是很严格的话可以这样处理,

1. 先判断要处理的日期的时间补偿(比如2013-03-10:00:00:00 为7)

2.处理后的时间补偿(2013-03-10 09:00:00 为8)

3 两者如果不一样再确定是否需要做+或者-1的调整




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值