获取一周的一周,使用java日历将星期日作为一周的第一天

时间:2016-01-25 21:44:49

标签: java calendar

我正在尝试为我们的财务部门生成一些代码,并且他们需要一个字段来为他们提供当年的当前周,但是基于星期日是一周的第一天。因此,例如01-25-16(MM-dd-yyyy)将是第4周。但是当我使用java.util.Calendarcalendar.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。

2 个答案:

答案 0 :(得分:3)

您必须更改minimalDaysInFirstWeek,请参阅Calendar#setMinimalDaysInFirstWeek(int)

  

设定一年中第一周所需的最短天数;例如,如果第一周定义为包含一年中第一个月的第一天的那一周,则使用值1调用此方法。如果它必须是整周,则使用值7.

另见GregorianCalendar

  

例如,1998年1月1日是星期四。如果getFirstDayOfWeek()MONDAYgetMinimalDaysInFirstWeek()为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?