我希望将本周的第一天设置为星期日之后,将本周的第9周设为2018年9月10日。我仍然从下面的代码段中得到41的输出
Calendar c = Calendar.getInstance();
c.setFirstDayOfWeek(Calendar.SUNDAY);
System.out.println( c.get(Calendar.WEEK_OF_YEAR) );
我在这里想念东西吗?
背景:我们的周开始时间可能会有所不同。我们的配置可以让用户确定一周的第一天。
答案 0 :(得分:0)
抱歉,如果我太执着了。我仍然认为您应该将计算留给自定义WeekFields
对象。如果我正确理解了您的评论,则需要:
final int daysPerWeek = DayOfWeek.values().length; // A wordy way of writing 7 :-)
WeekFields customWeekFields = WeekFields.of(firstDayOfWeek, daysPerWeek);
int customWeekNumber = date.get(customWeekFields.weekOfWeekBasedYear());
为了测试这是否与您正在做的事情一致,我编写了以下方法:
static void printWeekNumber(DayOfWeek firstDayOfWeek, LocalDate date) {
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("EEE uuuu-MM-dd", Locale.ENGLISH);
final int daysPerWeek = DayOfWeek.values().length;
// Week number according to your comment: “using the Temporal adjusters
// I am getting the date on the last day of the week.
// After that dividing the Day of the Year from the API by 7”
DayOfWeek lastDayOfWeek = firstDayOfWeek.minus(1);
int askersCommentWeekNumber = date
.with(TemporalAdjusters.nextOrSame(lastDayOfWeek))
.getDayOfYear()
/ daysPerWeek;
// My suggested way of calculating the same week number
WeekFields customWeekFields = WeekFields.of(firstDayOfWeek, daysPerWeek);
int customWeekNumber = date.get(customWeekFields.weekOfWeekBasedYear());
System.out.format(Locale.ENGLISH, "Week begins on %-8s Date is %s. Week %2d or %2d, agree? %s%n",
firstDayOfWeek, date.format(dateFormatter),
askersCommentWeekNumber, customWeekNumber,
askersCommentWeekNumber == customWeekNumber);
}
为了便于手工检查计算,我选择了不同年份的一月日期:
printWeekNumber(DayOfWeek.SUNDAY, LocalDate.of(2017, Month.JANUARY, 9));
printWeekNumber(DayOfWeek.MONDAY, LocalDate.of(2017, Month.JANUARY, 9));
printWeekNumber(DayOfWeek.THURSDAY, LocalDate.of(2017, Month.JANUARY, 9));
printWeekNumber(DayOfWeek.SUNDAY, LocalDate.of(2018, Month.JANUARY, 9));
printWeekNumber(DayOfWeek.MONDAY, LocalDate.of(2018, Month.JANUARY, 9));
printWeekNumber(DayOfWeek.SUNDAY, LocalDate.of(2019, Month.JANUARY, 9));
printWeekNumber(DayOfWeek.MONDAY, LocalDate.of(2019, Month.JANUARY, 9));
输出:
Week begins on SUNDAY Date is Mon 2017-01-09. Week 2 or 2, agree? true Week begins on MONDAY Date is Mon 2017-01-09. Week 2 or 2, agree? true Week begins on THURSDAY Date is Mon 2017-01-09. Week 1 or 1, agree? true Week begins on SUNDAY Date is Tue 2018-01-09. Week 1 or 1, agree? true Week begins on MONDAY Date is Tue 2018-01-09. Week 2 or 2, agree? true Week begins on SUNDAY Date is Wed 2019-01-09. Week 1 or 1, agree? true Week begins on MONDAY Date is Wed 2019-01-09. Week 1 or 1, agree? true
但是,请检查结果是否符合您的要求。对于您问题中的示例,结果既不是41也不是42:
printWeekNumber(DayOfWeek.SUNDAY, LocalDate.of(2018, Month.OCTOBER, 9));
Week begins on SUNDAY Date is Tue 2018-10-09. Week 40 or 40, agree? true
编辑:如果您希望使用ISO 8601周编号,请使用date.get(WeekFields.ISO.dayOfWeek())
。如果您希望按照ISO 8601的要求自定义一周的第一天和第一周的四天,请使用:
WeekFields customWeekFields = WeekFields.of(firstDayOfWeek, 4);