`
fjguodong
  • 浏览: 39390 次
社区版块
存档分类
最新评论

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

    博客分类:
  • 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类型)”的时区转换方法如下:

 

// 该时间为东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传到画面,就可以执行有特定需要的倒计时功能了。

 

分享到:
评论

相关推荐

    JAVA_API1.6文档(中文)

    java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中显示元素逻辑相关的实体之间传输信息。 java.awt.event 提供处理由 AWT 组件所激发的...

    Java语句获取系统时间与实际时间相差8小时的解决办法.doc

    本文档的主要内容详细介绍的是java新日期结果与操作系统时间相差8小时处理解决方法。   最近有遇到java的时间不对的事件,现象:通过java语句获得系统时间,取得的时间总是比系统时间少8个小时,获得的总是...

    Java 1.6 API 中文 New

    java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中显示元素逻辑相关的实体之间传输信息。 java.awt.event 提供处理由 AWT 组件所激发的...

    JavaAPI1.6中文chm文档 part1

    java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中显示元素逻辑相关的实体之间传输信息。 java.awt.event 提供处理由 AWT 组件所激发的...

    基于java的图像处理(论文+系统)

    日常工作中,经常会遇到要批量的给图片加滤镜,加水印,按需求缩放图片等操作,如果不懂编程,可能就需要你用ps一张一张的打开图片,修改图片再保存,大量的重复工作将占用你很多宝贵的时间。如果需要处理的图片量大...

    JAVA上百实例源码以及开源项目

     Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,得到Graphics实例,得到Image实例,填充颜色数组数据,初始化颜色数组。...

    JAVA上百实例源码以及开源项目源代码

     Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,得到Graphics实例,得到Image实例,填充颜色数组数据,初始化颜色数组。...

    java开源包11

    使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的PList类库 Blister Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用...

    java开源包6

    使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的PList类库 Blister Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用...

    java开源包9

    使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的PList类库 Blister Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用...

    java开源包101

    使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的PList类库 Blister Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用...

    java开源包4

    使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的PList类库 Blister Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用...

    java开源包5

    使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的PList类库 Blister Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用...

    JavaAPI中文chm文档 part2

    java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中显示元素逻辑相关的实体之间传输信息。 java.awt.event 提供处理由 AWT 组件所激发的...

    java开源包8

    使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的PList类库 Blister Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用...

    java开源包10

    使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的PList类库 Blister Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用...

    java api最新7.0

    java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中显示元素逻辑相关的实体之间传输信息。 java.awt.event 提供处理由 AWT 组件所激发的...

    java jdk-api-1.6 中文 chmd

    java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中显示元素逻辑相关的实体之间传输信息。 java.awt.event 提供处理由 AWT 组件所激发的...

    Java技巧:实例讲解Servlet的图象处理

    能方便快捷的实现一些简单的图形(不能称之图象),比如条形图,我们不必去用 java来生成并显示图象,(java生成图象很慢),我们可以这样来作,先用作图工具作一个很小的你需要的图片,再根据你所处理的数据量来实时的...

Global site tag (gtag.js) - Google Analytics