我想计算一年特定周数的星期一。我就是这样做的:
final GregorianCalendar calendar = new GregorianCalendar(Locale.GERMANY);
calendar.clear();
calendar.set(Calendar.YEAR, 2012); // set to 2012
calendar.set(Calendar.WEEK_OF_YEAR, 20); // set to week number 20
calendar.setTimeZone(TimeZone.getTimeZone("Europe/Berlin")); // set time zone
SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yy"); // german format
System.out.println(sdf.format(calendar.getTime())); // return date
这必须返回2012年5月14日(德语格式为14.05.12),但它将返回2012年5月16日,但这是错误的。
因此2012年的+ 2,2011是正确的,2010年是-1。
为什么GregorianCalendar计算错误的日期?
提前致谢并欢迎来自德国。
答案 0 :(得分:2)
这取决于getFirstDayOfWeek()返回的内容以及1月1日的哪一天。
来自Javadocs:
为WEEK_OF_YEAR字段计算的值范围为1到53.周 1年一年是最早的七天开始 getFirstDayOfWeek()至少包含getMinimalDaysInFirstWeek() 那一年的日子。因此它取决于的价值 getMinimalDaysInFirstWeek(),getFirstDayOfWeek(),以及 1周的一周1.一年的第1周和第1周的第1周 下一年按顺序从2到52或53(如 需要)。
例如,1998年1月1日是星期四。如果getFirstDayOfWeek()是 MONDAY和getMinimalDaysInFirstWeek()是4(这些是值 反映ISO 8601和许多国家标准),然后是1998年第1周 从1997年12月29日开始,到1998年1月4日结束。但是,如果 getFirstDayOfWeek()是SUNDAY,1998年1月1日开始 1998年4月10日,1998年1月10日结束; 1998年头三天 然后是1997年第53周的一部分。
答案 1 :(得分:1)
尝试设置DAY_OF_WEEK
:
final GregorianCalendar calendar = new GregorianCalendar(Locale.GERMANY);
calendar.clear();
calendar.set(Calendar.YEAR, 2012); // set to 2012
calendar.set(Calendar.WEEK_OF_YEAR, 20); // set to week number 20
calendar.set( Calendar.DAY_OF_WEEK, Calendar.MONDAY ); //set day to monday
calendar.setTimeZone(TimeZone.getTimeZone("Europe/Berlin")); // set time zone
SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yy"); // german format
System.out.println(sdf.format(calendar.getTime())); // return date
对我来说,返回14.05.12,16.05.11和17.05.10。
编辑:
因此,2012年的+ 2,2011是正确的,2010年是-1。
如果我理解正确,你会得到16.05.10,16.05.11和16.05.12,对吗?
这表明日历的一部分被重用。从2011年开始,你有没有连续测试过?如果是这样,仅在没有任何clear()
等的情况下更改年份将保留先前计算的日期。