2010-11-19 74 views
2

无法在这里找到适合我的情况的解决方案。对不起,如果这之前已经回答,但我找不到一个为我工作。Java日历算术问题

问题:试图测试一个用户会话是否已经活动超过超时限制。

我想使用会话开始时间和当前系统时间,并减去它们,如果结果大于超时var - 杀死会话。

所以:

for (LogSession logSession : sessionLogList) { 

       Calendar sessionStartTime = logSession.getStartTime(); 
       Calendar currentSysTime = Calendar.getInstance(); 
       currentSysTime.setTime(currentSysTime.getTime()); 
       Calendar activeTime = Calendar.getInstance(); 

       activeTime.setTime(sessionStartTime.getTime()); 
       activeTime.add(activeTime.getTime(), - currentSysTime.getTime()); 

       if (activeTime.getTime() > timeoutLimit) { 
         // Do something 
       } 
} 

我明明才能上线activeTime.add一条错误消息,但我不确定在这里所需要的方法。任何帮助将非常感谢。

超时当前设置为15分钟,但是可以更改的全局变量。

+0

什么是错误信息?另外,我不明白为什么setTime调用是必要的:Calendar currentSysTime = Calendar.getInstance(); currentSysTime.setTime(currentSysTime.getTime()); – 2010-11-19 14:39:08

回答

1

你的样品似乎有它的几个错误但这里是我如何去做。

Calendar sessionEndTime = logSession.getStartTime(); 
sessionEndTime.add(Calendar.MINUTE, TIMEOUT_MINS); 
Calendar currentSysTime = Calendar.getInstance(); 
if (currentSysTime.after(sessionEndTime)) { 
//do something 
} 
+0

感谢这种方法大脑,但我得到了一个sessionEndTime的分配错误 - 不能将void转换为日历。日历sessionStartTime = logSession.getStartTime();日历currentSysTime = Calendar.getInstance();日历sessionEndTime = sessionStartTime.add(Calendar.MINUTE,timeout_mins);有任何想法吗? – Frank 2010-11-22 11:35:56

+0

哎呀!对不起,由于某种原因,我认为日历是不可改变的。傻傻的我。我会编辑我的帖子以反映你应该做的事情! – brain 2010-11-22 11:39:19

+0

感谢您的出色解决方案!建议最好的方法! – Frank 2010-11-22 14:19:25

3

阅读API,在calendar.add方法中声明您需要特定于您要添加的字段。 例子

calendar.add(Calendar.HOUR, 24); 

但是你不需要使用日历操作。

只是要curentTimeInMillis的减法与以毫秒起始时间,如果大(以毫秒计),那么您的超时,那么你有你的答案

long refTime = System.currentTimeMillis(); 
long now = System.currentTimeMillis(); 
if (now - refTime > TIMEOUT) { 
    ... } 
1
for (LogSession logSession : sessionLogList) { 

       Calendar sessionStartTime = logSession.getStartTime(); 
       Long now = System.currentTimeMillis(); 

       if (now - sessionStartTime.getTimeInMillis() > timeoutLimit) { 
         // Do something 
       } 
} 
0

如果你比较会话开始时间和当前时间,其结果将是,每一个环节都有最大的年龄,并重置活动rgardless。

您需要logSession对象中最后活动时间的属性,并使用该属性与当前时间进行比较。如果这些时间是简单的long字段并分配了System.currentTimeMilis()您不需要Calendar算术。

0

我假设你在某个web容器中并且有可用的web.xml。你不能使用标准吗?

<session-config> 
<session-timeout>30</session-timeout> 
</session-config>