【问题标题】:Find Time Difference查找时差
【发布时间】:2021-05-29 05:10:20
【问题描述】:

我想在 java 中找到时差,以便在会话过期时创建新会话,否则将分配新时间。

【问题讨论】:

标签: java time


【解决方案1】:
Returns Time Diffrence in Seconds :




long elapsed_time = 0L;
    java.util.Date startTime = null;
    java.util.Date endTime = null;
    double fsec = 0L;
    String rSec = "";   

        startTime = new java.util.Date();

        <--------Some Operation----->

        endTime = new java.util.Date();
        elapsed_time = endTime.getTime() - startTime.getTime();
        fsec = (elapsed_time) / 1000.00;
        rSec = Double.toString(fsec);
        rSec = rSec + " Sec";

【讨论】:

  • +0:使用 Date 的权重比较大,而且经常不准确。
【解决方案2】:

您可以使用System.currentTimeMillis(); 获取 Java 中的当前系统时间(自 01-01-1970 00:00:00 GMT 以来的毫秒数)。

会话对象很可能还具有获取会话上次使用时间的方法(在您正在使用的任何会话对象的 API 文档中查找)。

从会话中减去当前时间,您就知道距离上次使用会话已有多长时间了。如果超过了超时时间,做任何你必须做的事情。

请注意,servlet 容器具有用于使会话无效的内置机制,您无需手动使会话无效。另外,如果没有会话,HttpRequest.getSession() 会自动为您创建一个新的HttpSession 对象。

【讨论】:

    【解决方案3】:

    使用 Date 意味着创建一个不需要的对象,因为它只是包装了System.currentTimeMillis() 不幸的是,这个函数最多只能精确到一毫秒,在某些 Windows 系统上大约是 16 毫秒。

    更好的方法是在 Oracle 的 JVM、Windows XP - 7、Solaris 和最新版本的 Linux 上使用 System.nanoTime(),这可以精确到 1 微秒以上。它不会创建任何对象。

    long start = System.nanoTime();
    // do something.
    long time = System.nanoTime() - start; // time in nano-seconds.
    // time in seconds to three decimal places
    String timeTaken = time/1000000/1e3 + " seconds"; 
    

    【讨论】:

    • 实际上无法保证nanoTime() 的准确性; Java API 不保证其精确到小于 1 微秒。但这是比使用java.util.Date 对象更好的解决方案。
    • @Jesper,我同意没有担保人。然而,Oracle 的 JVM 恰好在 Windows XP - 7、Solaris 和最新版本的 Linux 上执行此操作。
    • 是的,但也许您应该提及这一点,而不是毫无保留地声明它的精确度小于 1 微秒。
    • +1:但在我的 XP 上,它的精确度不低于 1.4 μs [:-)(写在我看到更新之前)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-05
    • 2013-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多