【发布时间】:2021-05-29 05:10:20
【问题描述】:
我想在 java 中找到时差,以便在会话过期时创建新会话,否则将分配新时间。
【问题讨论】:
我想在 java 中找到时差,以便在会话过期时创建新会话,否则将分配新时间。
【问题讨论】:
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";
【讨论】:
您可以使用System.currentTimeMillis(); 获取 Java 中的当前系统时间(自 01-01-1970 00:00:00 GMT 以来的毫秒数)。
会话对象很可能还具有获取会话上次使用时间的方法(在您正在使用的任何会话对象的 API 文档中查找)。
从会话中减去当前时间,您就知道距离上次使用会话已有多长时间了。如果超过了超时时间,做任何你必须做的事情。
请注意,servlet 容器具有用于使会话无效的内置机制,您无需手动使会话无效。另外,如果没有会话,HttpRequest.getSession() 会自动为您创建一个新的HttpSession 对象。
【讨论】:
使用 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 对象更好的解决方案。