如何在Java中找到一年中每个月的所有周数?

lokaqttq  于 12个月前  发布在  Java
关注(0)|答案(1)|浏览(79)

我希望建立一个函数,它返回一个数组,其中一年中前几个月的所有周数都与某个特定月份的周数相同。
我使用星期一作为第一天的一周,我采取的第一周的一个月的一周与第一个星期一的当月。

输入:年的星期和年。例如,27和2019。7月的第一个星期(7)。
输出:月份中的周数组。例如,[2,6,10,14,19,23,27]。
我尝试

private void getResult(int weekYear)
{
    LocalDate date = LocalDate.now();
    final int weekNumber = 27;
    LocalDate newDate = date.with(IsoFields.WEEK_OF_WEEK_BASED_YEAR, weekNumber);
    int month = newDate.getMonthValue();;
        
    int weekMonth = LocalDate.from(newDate).get(WeekFields.ISO.weekOfMonth());
        
    System.out.println(newDate);
    System.out.println(month);
    System.out.println(weekMonth);
        
    ArrayList<Integer> list = new ArrayList<Integer>();
        
    for (int i = 1; i <= month; i++)
    {
        LocalDate tempDate = date.withYear(2019).withMonth(i).with(WeekFields.ISO.weekOfMonth(), weekMonth);
        int tempYear = LocalDate.from(tempDate).get(WeekFields.ISO.weekOfWeekBasedYear());
        list.add(tempYear);
    }
        
    list.forEach((e) -> System.out.print(e + " "));
}
int weekYear = 27;
getResult(weekYear);

我得到的:[1 6 10 14 18 23 27]。
我要找的内容:我有两个问题:

1.第一个:获得的结果与预期的不同。我认为问题是由于我没有指定如何计算每月的第一周(每月的第一个星期一)。对不对?我该怎么解决呢?
1.第二个:什么是更好的解决方案?

66bbxpm5

66bbxpm51#

我认为这里的关键是理解几点(希望 * 我 * 从你的问题中正确理解了它们)。
1.你用两种不同的方式来计算周数。对于一年中使用ISO编号的星期:一年的第一周是包括新年至少4天的一周。对于一个月中的一周,你计算的是星期一(你可以说一个月的第一周是包括一个月中的 * 七 * 天,而不是四天)。
1.周数可能不总是存在。如果您的起始点在该月的第0周或第5周,则前一个月可能没有该周。
得到的结果与预期的结果不同。我认为问题是由于我没有指定如何计算每月的第一周(每月的第一个星期一)。对不对?我该怎么解决呢?
我相信你是对的。要计算每月的星期一,您可以用途:

LocalDate tempDate = date.withYear(2019)
                .withMonth(i)
                .with(ChronoField.DAY_OF_WEEK, DayOfWeek.MONDAY.getValue())
                .with(ChronoField.ALIGNED_WEEK_OF_MONTH, weekMonth);

(当然,DayOfWeek.MONDAY.getValue()只是说1的罗嗦方式,但更好地传达了意图,所以我更喜欢它。
通过对代码的这一更改,输出是预期的:
2 6 10 14 19 23 27
关键字是ChronoField.ALIGNED_WEEK_OF_MONTH。一个月的对齐周从该月的第一天开始,并且始终为7天,而不考虑一周中的哪几天。第一个对齐的星期是从每月的第1到第7,第二个对齐的星期是从第8到第14,等等。由于我们已经将星期设置为星期一,因此将对齐的星期设置为1将为我们提供该月的第一个星期一,等等。
不过,我们已经结束了。如果将weekNumber设置为40,则会得到
2 6 10 14 14 23 27 27 36 41
我原以为40是列表中的最后一个数字,但它不在那里。2019年的第40周是从9月30日星期一到10月6日,所以如果我理解正确的话,你想要的是那些有第5周的月份的第5周。这让我们回到了并非所有月份都有第5周的问题(因为他们没有5个星期一)。因为我在星期二运行代码,所以它以第40周的星期二,也就是10月1日为起点,因此给了我每个月的第1周而不是第5周。
是否有更好的解决办法?你能推荐一个吗?
我真的不能。我觉得你现在的状态很好。
只是你没有使用int weekYear参数。您可能希望使用它来代替weekNumber局部变量。在任何情况下,您都应该删除其中一个并使用另一个。
还有这个不相关的提示:你使用LocalDate.from(someLocalDate)是多余的,因为它只是再次给你相同的LocalDate(无论是相同的对象还是相等的对象,我不知道也不关心)。在这些情况下使用someLocalDate即可。

相关问题