我正在尝试为我们的财务部门生成一些代码,并且他们需要一个字段来为他们提供当年的当前周,但是基于星期日是一周的第一天。因此,例如01-25-16(MM-dd-yyyy)将是第4周。但是当我使用java.util.Calendar
和calendar.setFirstDayOfWeek
到周日尝试时,它告诉我这是第5周,因为它似乎从12月底到1月3日为第1周。
这是我到目前为止编写的代码:
private static int getWeekOfYearBySunday(DateTime dt){
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(dt.getMillis());
calendar.setFirstDayOfWeek(Calendar.SUNDAY);
return calendar.get(Calendar.WEEK_OF_YEAR);
}
这会返回一个5的星期数,即使它是星期日的星期开始时它应该是4。
答案 0 :(得分:3)
您必须更改minimalDaysInFirstWeek
,请参阅Calendar#setMinimalDaysInFirstWeek(int):
设定一年中第一周所需的最短天数;例如,如果第一周定义为包含一年中第一个月的第一天的那一周,则使用值1调用此方法。如果它必须是整周,则使用值7.
例如,1998年1月1日是星期四。如果
getFirstDayOfWeek()
为MONDAY
且getMinimalDaysInFirstWeek()
为4(ISO 8601标准兼容设置),则1998年第1周开始于1997年12月29日,并于1998年1月4日结束。因此,如果getFirstDayOfWeek()
为SUNDAY
,则1998年第1周从1998年1月4日开始,到1998年1月10日结束; 1998年的前三天是1997年第53周的一部分,他们的一周是1997年。
但是,如果您为财务部门编码,则应该使用正确的Locale
创建日历,而不是更改某些属性,请参阅Calendar#getInstance(Locale):
使用默认时区和指定的区域设置获取日历。返回的
Calendar
基于具有给定区域设置的默认时区中的当前时间。
答案 1 :(得分:2)
一年中某周的定义取决于区域设置。有关更多信息,请参阅此相关问题。 Why dec 31 2010 returns 1 as week of year?