Java中的时间处理遇到的问题_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > Java中的时间处理遇到的问题

Java中的时间处理遇到的问题

 2013/7/25 15:43:21  fjguodong  程序员俱乐部  我要评论(0)
  • 摘要:最近在做一个与时间处理相关的开发,需要在进入某个画面的时候在js中进行倒计时,用以实现特定的功能。在进入到这个画面之前,需要在该画面的初始化Action中计算出倒计时的时间值interval。我从数据库中得到一个订单生成时间(用户端时间,String类型),先转成Date类型。然后再取现在Action中的当前时间,然后用Date的getTime()方法取的两个时间差,就得到了这条订单从生成到现在已经经过的时间time_1
  • 标签:Java 问题

? ? ? ??最近在做一个与时间处理相关的开发,需要在进入某个画面的时候在js中进行倒计时,用以实现特定的功能。在进入到这个画面之前,需要在该画面的初始化Action中计算出倒计时的时间值interval。

?

? ? ? ??我从数据库中得到一个订单生成时间(用户端时间,String类型),先转成Date类型。然后再取现在Action中的当前时间,然后用Date的getTime()方法取的两个时间差,就得到了这条订单从生成到现在已经经过的时间time_1,然后再拿“订单允许操作”的时间time_2减去time_1就得到了倒计时时间interval。接着跳转到画面后,以该“倒计时时间interval”作为初始值,用js进行倒计时,以完成特定功能。

?

? ? ? ??功能算是完成了,但是稍微测试一下就发现,上面的倒计时时间计算一直有问题。经过调查找到了发成问题的原因:

? ? ? ??订单的生成时间由DB(DB部署在PC_A上)产生,用于画面表示的时候,还要转化成客户端的时间(这里是根据配置文件里中的客户端时区进行转化),而这个时间也是上面说到的“订单生成时间(用户端时间,String类型)”。Web系统部署在电脑PC_B上,当前时间的获取是由WEB系统中的Action完成。由于PC_A与PC_B在时间值和时区上存在差别,同时订单生成时间(用户端时间,String类型)”对应的时区与PC_B也不一致,就导致了上面时间差计算的问题。而我所面临的问题是PC_A与PC_B电脑的时区一致,但时间值不一致,同时订单生成时间(用户端时间,String类型)”对应的时区与PC_B也不一致。

?

? ? ? ??因此,根据上面的分析,我在计算倒计时时间时就需要考虑到PC_APC_B时间值的偏差,以及订单生成时间(用户端时间,String类型)”的时区转换。由于是开发环境,导致了“PC_APC_B”存在时间偏差的发生,这里设置了一个参数,为两台电脑的时间偏差,用于修正倒计时时间。

?

? ? ? ??订单生成时间(用户端时间,String类型)”的时区转换方法如下:

?

class="java" name="code">// 该时间为东8区的时间
String orderReceiptFrontDate = "2013-07-23 12:12:12";

// 配置源时间格式
SimpleDateFormat dbFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss",new Local("zh","CN"));
dbFormat.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
dbFormat.setLenient(false);

// Date内置的时区参数与系统有关系,本人当前系统的时区是东9区,
// 因此该Date反映的是东9区时间
Date orderReceiptDate = null;
try{
    // 按照源时间格式读取时间文本,并把它转化为Date的数据类型
    // 此Date类对象体现了当前时区下的时间
    orderReceiptDate = dbFormat.parse(orderReceiptFrontDate);
}catche(ParseException e){ /*省略*/}

// 通过以上方式,就能把orderReceiptFrontDate所表示的东8区时间,自动转换为
// 东9区的时间对象Date orderReceiptDate

?

?

? ? ? ? 时间差计算的方法如下:

// 换算成同一时区下PC_A与PC_B的偏差时间,用于倒计时时间的修正
String deviationTime_str = ... /* 读取配置文件中的数值,可以为负数,单位为秒 */
long deviationTime = 0L;
try{
    deviationTime = Long.valueOf(deviationTime_str);
}catch(NumberFormatException e){ /* 省略 */ }

// 订单允许操作时间,从订单生成的时间开始计算,单位秒
String invalidTime_str = ... /* 读取配置文件中的数值,正整数,单位为秒 */
long invalidTime = 0L;
try{
    invalidTime = Long.valueOf(invalidTime_str );
}catch(NumberFormatException e){ /* 省略 */ }

/*
按照上面的转化方式,将
String orderReceiptFrontDate = "2013-07-23 12:12:12"; // 东八区时间
转化换为当前系统所在时区的时间,得到东9区的时间对象 Date orderReceiptDate
*/

// 获取系统当前时间
Date now = new Date();

// 计算倒计时时间
long lastTime = invalidTime - (now.getTime()/1000L - orderReceiptFrontDate.getTime()/1000L)
        + deviationTime;

?

?

? ? 把上面计算得到的lastTime传到画面,就可以执行有特定需要的倒计时功能了。

?

发表评论
用户名: 匿名