【问题标题】:Java help comparing Calendar objectsJava 帮助比较日历对象
【发布时间】:2011-01-26 19:57:29
【问题描述】:

我用 Java 开发了一个日历小部件(专门用于 BlackBerry 开发)。用户可以查看当前月份的所有天数,也可以按月/年向前/向后移动。

当我绘制日历(以表格格式)时,我想更改比当前日期提前 X 天的任何日期的颜色。我目前只能在屏幕上显示的日历与当前月份相同的月份进行检查:

    if (calendarMonth == currentMonth) {
        for (int i = 1; i <= (NUM_DAYS_IN_MONTH); i++) {
            if (i > currentDay + Constants.CALENDAR_DAYS_IN_ADVANCE) {
                System.out.println("VALID: " + i);
            }
        }
    }

但是当显示的日历与当前月份不同时,我无法编写解决方案。例如,今天是 1 月 26 日,因此 1 月日历会将所有 1 月的日子显示为灰色。当用户将月份更改为二月时,接下来的几天应该是灰色的:

Constants.CALENDAR_DAYS_IN_ADVANCE = 14;
1/26/2011 - 2/9/2011

超过该范围的任何日子都将是黑色。所以基本上,我正在寻找一个函数,它将接受两个 java.util.Calendar 对象(显示的活动日历和当前日期的日历),并且该函数将返回当前日期范围内的日期数组 - CALENDAR_DAYS_IN_ADVANCE。

我还需要记住以下几点:

1) 我无法将日期与 java.util.Calendar.add() 或 java.util.Calendar.subtract() 函数进行比较,因为 BlackBerry 的 java 是有限的

2) 这也必须跨年工作,例如 2010 年 12 月 - 2011 年 1 月

谁能帮忙解释一下逻辑?

谢谢!

【问题讨论】:

  • 设置月份时为什么要设置monthOfYear-1?

标签: java object blackberry calendar compare


【解决方案1】:

假设您有 2 个Calendar 实例:nowCal 指向开始日期的 00:00:00,maxOffsetCal 指向结束日期的 23:59:59。 以下代码将打印所需的日期:

public class Test {
    private final static long MILLIS_IN_DAY = 86400 * 1000;

    public static void main(String[] args) {
        Calendar nowCal = new GregorianCalendar();
        setTime(nowCal, 29, 1, 2011, 0, 0, 0);
        Calendar maxOffsetCal = new GregorianCalendar();
        setTime(maxOffsetCal, 2, 2, 2011, 23, 59, 59);
        long now = nowCal.getTimeInMillis(), endTime = maxOffsetCal.getTimeInMillis();
        for (; now < endTime; now += MILLIS_IN_DAY ) {
            System.out.println(new Date(now));
        }
    }

    private static void setTime(Calendar c, int dayOfMonth, int monthOfYear, int year,
                                    int hourOfDay, int minute, int second) {
        c.set(Calendar.DAY_OF_MONTH, dayOfMonth);
        c.set(Calendar.MONTH, monthOfYear - 1);
        c.set(Calendar.YEAR, year);
        c.set(Calendar.HOUR_OF_DAY, hourOfDay);
        c.set(Calendar.MINUTE, minute);
        c.set(Calendar.SECOND, second);
        c.set(Calendar.MILLISECOND, 0);
    }
}

【讨论】:

  • 这对我帮助很大,现在我知道中间的日子了。这些天我在绘制日历时只需要交叉引用。谢谢!
【解决方案2】:

if (calendarMonth == currentMonth)

错了。永远不要使用 == 来比较对象。运算符 == 比较引用,因此仅当您处理相同的对象但不处理不同的相等对象时才成立。您应该改用equals() 方法。

【讨论】:

  • 在这种情况下,我会使用 ==。 calendarMonth 和 currentMonth 都是原始类型 int
猜你喜欢
  • 2011-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多