如何在Java日历中设置一年的第一个月

时间:2019-03-01 16:35:26

标签: java calendar

我的要求是我想通过日期获得一年中的星期数。

规则:

一年的第一个月应该是二月。  一周应该从星期六到星期五开始。

例如:

02/01/2019 - should return week number as 1
02/02/2019 - should return week number as 2

1 个答案:

答案 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。