【问题标题】:Help with java calendar logicjava日历逻辑的帮助
【发布时间】:2011-03-18 19:06:01
【问题描述】:

我正在使用 Java 日历类来执行以下操作:

  1. 设置开始日期
  2. 设置结束日期
  3. 该范围内的任何日期都是“有效”日期

我有这个有点工作,有点没有。请看下面的代码:

    nowCalendar.set(Calendar.DATE, nowCalendar.get(Calendar.DATE) + offset);
    int nowDay = nowCalendar.get(Calendar.DATE);

    Calendar futureCalendar = Calendar.getInstance();
    futureCalendar.set(Calendar.DATE, nowDay + days);

    Date now = nowCalendar.getTime();
    Date endTime = futureCalendar.getTime();

    long now_ms = now.getTime();
    long endTime_ms = endTime.getTime();

    for (; now_ms < endTime_ms; now_ms += MILLIS_IN_DAY) {
        valid_days.addElement(new Date(now_ms));
        System.out.println("VALID DAY: " + new Date(now_ms));
    }

基本上,我设置了一个“NOW”日历和一个“FUTURE”日历,然后比较这两个日历以找到有效日期。在我的日历上,有效日期将显示为白色,无效日期将显示为灰色。你会注意到两个变量:

    offset = three days after the current selected date
    days = the number of valid days from the current selected date

这可行...除非当前选择的日期是该月的最后一天,或前两天(三个一起)。我认为它的偏移量肯定会搞砸它,但逻辑在其他任何地方都有效。有任何想法吗?

【问题讨论】:

    标签: java date calendar


    【解决方案1】:

    不要摆弄毫秒。克隆 nowCalendar,在循环中使用 Calendar#add() 添加 1 天,只要它不超过 futureCalendar,然后使用 Calendar#getTime() 从中取出 Date

    Calendar clone = nowCalendar.clone();
    
    while (!clone.after(futureCalendar)) {
        validDays.add(clone.getTime());
        clone.add(Calendar.DATE, 1);
    }
    

    (请注意,我将 validDays 改进为 List,而不是旧版 Vector

    【讨论】:

    • BalusC- 我确实实施了您的解决方案(这更清洁,谢谢),但是我仍然遇到我原来的问题。在选择我的任何日历日期之前,现在日历是:2011 年 3 月 18 日,未来日历是 2011 年 3 月 31 日。选择该月最后三天之一后,现在日历变为 2011 年 4 月 3 日,未来日历变为 2011 年 4 月 2 日。
    • 得到它的工作 - 谢谢。关于不摆弄毫秒,你当然是对的。
    【解决方案2】:

    在第一行使用add而不是set,否则如果您在月份边界,则不会调整月份:

    nowCalendar.add(Calendar.DATE, offset);
    

    【讨论】:

    • 问题是我的应用程序是针对黑莓的,它只包含 Java 的一个子集。因此,我可以使用 set() 方法,但不能使用 add() 方法...
    【解决方案3】:
    public boolean isInRange(Date d)
    {
       Calendar cal = Calendar.getInstance();
       cal.setTime(d);
       return cal.after(startCal) && cal.before(endCal);
    }
    

    这里startCal是开始时间的日历实例,endCal是结束时间。

    【讨论】:

      【解决方案4】:

      我发现了问题:

      一旦我将 futureCalendar 设置为 nowCalendar 的克隆(加上额外的天数),它就开始工作了。谢谢大家的建议!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多