使用java.util.Calendar获取Java下一周的Java

时间:2012-07-17 14:19:59

标签: java calendar

我希望有一个函数可以返回给出一周和一年的下一周和一年。它看起来像:

public static int[] getNextWeek(int year, int week) {
    Calendar c = Calendar.getInstance(); // I'm Locale.US and TimeZone "America/New_York"
    c.clear();
    c.set(Calendar.YEAR, year);
    c.set(Calendar.WEEK_OF_YEAR, week);

    c.add(Calendar.WEEK_OF_YEAR, 1);

    return new int[] {c.get(Calendar.YEAR), c.get(Calendar.WEEK_OF_YEAR)}
}

这有时不适用于年界。它似乎取决于您调用它的日期以及您使用的参数!例如,如果我在2012年和第52周调用它,那么我预计结果将是2013年和第1周。如果您今天(2012年7月17日星期二)调用它,它可以正常工作。如果您将星期几设置为昨天则不会;奇怪的结果在2012年的第1周。奇怪。到底是怎么回事?它似乎与星期几有关,因为如果使用SUNDAY或MONDAY(2012年的最后两天)调用它,它将无效!如果我将星期几设置为一周的最后一天,则该功能似乎有效;在调用Calendar.add()之前我做了:

    // Must set to last day of week; initially set to first day due to API
    c.set(Calendar.DAY_OF_WEEK, c.getFirstDayOfWeek()); // SUNDAY
    c.add(Calendar.DAY_OF_WEEK, 6); // Must roll forward not backwards

如果我创建一个getPreviousWeek方法,似乎没有像这样的任何怪异。这是一个java.util.Calendar错误吗?下次我想我会用Joda时间!

3 个答案:

答案 0 :(得分:2)

您是否考虑过ISO8601周算法认为一年中的第一周是至少有4天在该年内的那一周?

因此,如果1月1日是星期六,那一周实际上被认为是上一年的第52周,而不是当年的第1周。

您可能希望至少考虑这种计算的joda-time,因为它正确处理ISO标准。

    LocalDate ld = new LocalDate();
    ld = ld.withWeekOfWeekyear(29);
    ld = ld.withWeekyear(2012);

    System.out.println(ld.getWeekOfWeekyear());
    System.out.println(ld.getWeekyear());

    // 29
    // 2012


    System.out.println(ld.plusWeeks(1).getWeekOfWeekyear());
    System.out.println(ld.plusWeeks(1).getWeekyear());
    // 30
    // 2012

这将跨越年界。

答案 1 :(得分:1)

只是做一个明确的检查,看是否有翻转。

return new int[] {c.get(Calendar.WEEK_OF_YEAR) == 1 ? c.get(Calendar.YEAR) + 1 :
    c.get(Calendar.YEAR), c.get(Calendar.WEEK_OF_YEAR)};

据我所知,WEEK_OF_YEAR无法正确添加的原因是因为它不是Calendar的实际属性,如SECONDMINUTE,{ {1}},MONTHDAY。它是像YEAR这样的派生属性。解决此问题的一种方法是使用WEEK_OF_MONTH添加7天而不是增加c.add(Calendar.DAY, 7)

答案 2 :(得分:1)

此时我会假设这确实是一个错误。我在这里填写了一份关于Oracle的错误报告:

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7197761