我希望有一个函数可以返回给出一周和一年的下一周和一年。它看起来像:
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时间!
答案 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
的实际属性,如SECOND
,MINUTE
,{ {1}},MONTH
或DAY
。它是像YEAR
这样的派生属性。解决此问题的一种方法是使用WEEK_OF_MONTH
添加7天而不是增加c.add(Calendar.DAY, 7)
。
答案 2 :(得分:1)
此时我会假设这确实是一个错误。我在这里填写了一份关于Oracle的错误报告: