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

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

 

分享到:
评论

相关推荐

    WIN7 JAVA获取时间有问题

    标题“WIN7 JAVA获取时间有问题”指出的问题可能涉及到在Windows 7操作系统中使用Java编程语言时,遇到时间处理的异常或不准确的情况。这可能是由于Java的时区设置、系统时间与程序之间的交互,或者是Java运行环境...

    java语言时间异常类

    在Java中,时间处理主要涉及到`java.util.Date`、`java.time`包(Java 8及以后版本)以及`java.text.SimpleDateFormat`等类。然而,当涉及时间计算或转换时,可能会遇到超出合理范围的情况,例如尝试创建一个超出24...

    java获取系统时间与实际相差8小时的解决方法

    首先,我们需要理解Java中的日期和时间处理。`java.util.Date`是早期Java版本中用于日期和时间操作的类,但它并不包含时区信息。在Java 8及更高版本中,`java.time`包被引入,提供了更强大和易于使用的API,如`...

    时间轮定时器java实现

    为了处理精度问题,可以采用多级时间轮,增加更多的环来提高精度。 在提供的压缩包文件"timewheel"中,可能包含了实现这两种定时器的Java代码示例。通过阅读和理解这些代码,你可以更好地掌握这两种定时器的实现...

    时间轮Java代码

    Java中的时间轮实现,尤其是Netty的`HashedWheelTimer`,提供了高性能的定时任务处理能力。理解时间轮的工作原理和使用方法,对于优化Java应用的性能,尤其是网络服务器和I/O密集型应用,具有重要意义。在实际开发中...

    java 获取系统时间错误,少了8小时

    在Java编程中,获取系统时间的操作通常是通过`java.util...总之,理解并正确处理Java中的时区和日期时间问题是避免此类问题的关键。对于涉及到跨时区操作的程序,应特别注意时区的设置和转换,以确保时间数据的准确性。

    java中 new date() 打印出的时间与系统时间错了八小时的解决方法

    总的来说,Java中`new Date()` 出现时间差的问题主要源于时区设置,可以通过调整JVM时区或者在代码中设定时区来解决。同时,不要忽视操作系统自身的时区设置,因为它可能会影响到其他非Java程序的时间显示。理解并...

    java 关于时间的代码

    在Java编程中,时间处理是不可或缺的一部分,尤其是在开发复杂的应用程序时。本资源包"java 关于时间的代码"提供了一些关键的示例,涵盖了时间、正则表达式、集合以及遍历等重要概念,旨在帮助开发者更好地理解和...

    Java中对日期的常用处理(转)

    在Java编程语言中,日期和时间的处理是常见的任务,特别是在开发业务系统或者数据分析时。本文将基于标题“Java中对日期的常用处理(转)”来深入探讨Java中的日期处理,结合`DateUtil.java`这个文件名,我们可以...

    专题资料(2021-2022年)java的时间处理续计算java时间.doc

    以下是一些关于Java时间处理的关键知识点: 1. **基于毫秒的时间计算**:Java中的时间计算是以1970年1月1日00:00:00 UTC为起点的,称为Unix纪元。`Date`类的`getTime()`方法返回自那时以来的毫秒数,这使得我们可以...

    JAVA_API1.6文档(中文)

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

    JAVA8时间插入mysql少了8小时的解决办法(csdn)————程序.pdf

    在Java 8中,开发人员经常遇到一个棘手的问题,即在使用MyBatis或任何其他JDBC驱动程序将`LocalDateTime`对象插入MySQL数据库时,时间会比预期少8小时。这个问题通常与时区设置有关,特别是涉及到数据库服务器和Java...

    java使用OpenCV从视频文件中获取帧

    "java使用OpenCV从视频文件中获取帧" Java使用OpenCV从视频文件中获取帧是指使用Java语言和OpenCV库从视频文件中提取图像帧的过程。本文将详细介绍如何使用Java和OpenCV从视频文件中获取帧,并提供了具体的代码实例...

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

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

    JAVA new Date()或Calendar.getInstance().getTime()得到的时间不对

    4. **Java版本问题**:不同版本的Java可能对时间处理有细微差异。确保使用的Java版本与应用需求兼容。 5. **环境问题**:如果是在分布式系统中,各个节点的时区或时间不一致,可能会导致问题。确保所有节点都有同步...

    java工具类,日志处理类

    这些工具方法可能涵盖异常处理、日志记录、字符串操作、日期时间处理、集合操作等多个方面,它们被设计为可复用的模块,以提升代码的重用性和开发效率。 总结来说,这个压缩包提供的内容涵盖了Java编程中的几个核心...

    基于red5 dsj 的java 处理视频流和一些疑问

    4. **视频流处理**:如何通过Java处理视频流,包括解码、编码、帧处理、时间同步等技术。 5. **问题与解答**:博主在实践过程中遇到的问题,例如性能优化、兼容性问题、流同步问题等,以及解决问题的方法和技巧。 ...

    java计算mp3时间

    在Java编程环境中,处理MP3音频文件可能会遇到各种挑战,特别是在获取MP3文件的播放时长方面。在你提到的问题中,"java计算mp3时间" 指的是使用Java来解析MP3文件并提取其播放长度。这个问题的解决通常涉及到第三方...

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

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

    Java 8 API 中版chm手册

    这份Java 8 API 中版chm手册是开发者的宝贵资源,它可以帮助开发者快速理解和掌握Java 8的新特性,提高开发效率,并避免编程中可能遇到的问题。通过深入阅读和实践手册中的内容,开发者可以更好地利用Java 8的强大...

Global site tag (gtag.js) - Google Analytics