我的要求是我想通过日期获得一年中的星期数。
规则:
一年的第一个月应该是二月。 一周应该从星期六到星期五开始。
例如:
02/01/2019 - should return week number as 1
02/02/2019 - should return week number as 2
答案 0 :(得分:2)
要想找到正确的解决方案,我会有些争执:如果我理解正确,那么2月的第一个星期五总是在第1周。第1周开始于6天之前。如果我们想象一个“第0周”从另外7天前开始,那么一天的周数将始终是自2月第一个星期五之前的“ 0周”开始以来的整周数。我们可以计算出来。
public static int getWeekNumber(LocalDate date) {
int year = date.getYear();
if (date.getMonth().equals(Month.JANUARY)) {
// calculate from February in previous year
year--;
}
LocalDate imaginaryWeek0Start = LocalDate.of(year, Month.FEBRUARY, 1)
.with(TemporalAdjusters.nextOrSame(DayOfWeek.FRIDAY))
.minusDays(13);
long weekNo = ChronoUnit.WEEKS.between(imaginaryWeek0Start, date);
return Math.toIntExact(weekNo);
}
让我们用问题中的两个示例日期进行尝试:
System.out.println(getWeekNumber(LocalDate.of(2019, Month.FEBRUARY, 1)));
System.out.println(getWeekNumber(LocalDate.of(2019, Month.FEBRUARY, 2)));
此打印:
1 2
如果您打算使用Calendar
类,那么我故意不这样做。该课程设计不佳,而且已经过时。相反,我推荐LocalDate
和现代Java日期和时间API java.time中的其他类。
链接: Oracle tutorial: Date Time解释了如何使用java.time。