【问题标题】:Java Calendar arithmetic issueJava日历算术问题
【发布时间】:2010-11-19 14:32:39
【问题描述】:

在这里找不到适合我的情况的解决方案。抱歉,如果之前已经回答过这个问题,但我找不到适合我的答案。

问题:尝试测试用户会话的活动时间是否超过超时限制。

我正在尝试使用会话开始时间和当前系统时间并减去它们,如果结果大于超时变量 - 终止会话。

所以:

 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 分钟,但它是一个可以更改的全局变量。

【问题讨论】:

  • 错误信息是什么?另外,我不明白为什么这里需要 setTime 调用: Calendar currentSysTime = Calendar.getInstance(); currentSysTime.setTime(currentSysTime.getTime());

标签: java time calendar timeout math


【解决方案1】:

阅读 API,在 calendar.add 方法中说明您还需要指定要添加的字段。 示例

calendar.add(Calendar.HOUR, 24);

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

只需减去curentTimeInMillis 与以毫秒为单位的开始时间,如果更大(以毫秒为单位),那么你的超时时间就会得到答案

long refTime = System.currentTimeMillis();
long now = System.currentTimeMillis(); 
if ( now - refTime > TIMEOUT ) { 
     ... } 

【讨论】:

    【解决方案2】:

    您的示例中似乎有一些错误,但这是我的处理方式。

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

    【讨论】:

    • 感谢大脑的这种方法,但我在 sessionEndTime 的分配上遇到错误 - 无法将 void 转换为日历。日历 sessionStartTime = logSession.getStartTime();日历 currentSysTime = Calendar.getInstance();日历 sessionEndTime = sessionStartTime.add(Calendar.MINUTE, timeout_mins);有什么想法吗?
    • 糟糕!对此感到抱歉,出于某种原因,我认为日历是不可变的。傻傻的我。我将编辑我的帖子以反映您应该做什么!
    • 感谢您的出色解决方案!建议的最佳方法!
    【解决方案3】:
     for (LogSession logSession : sessionLogList) {
    
                    Calendar sessionStartTime = logSession.getStartTime();
                    Long now = System.currentTimeMillis();
    
                    if (now - sessionStartTime.getTimeInMillis() > timeoutLimit) {
                           // Do something
                    }
    }
    

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 2016-08-22
          • 1970-01-01
          • 2017-04-02
          • 1970-01-01
          • 2016-11-24
          • 2011-08-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多