java - 如何使用Java查找一年中#周的所有周数

标签 java date time dayofweek java-time

正如我在标题中所说,我希望构建一个函数,该函数返回一个数组,其中包含一年中前几个月的所有周数,这些周数与某个特定月份的周数相同。

我使用星期一作为一周的第一天,我将本月的第一个星期一作为本月的第一周。

输入 : 年和年中的一周。例如,27 和 2019。七月 (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]。

我在找什么 : 我有两个问题:
  • 第一个:得到的结果与预期的不同。我认为问题是由于我没有指定如何计算当月的第一周(本月的第一个星期一)。这样对吗?我该如何解决?
  • 第二个:有没有更好的解决方案?你能推荐一个吗?

  • 谢谢你的时间。

    最佳答案

    我认为这里的关键是理解几点(希望我已经正确理解了它们)。

  • 您以两种不同的方式计算周数。对于您使用 ISO 编号的一年中的一周:一年中的第一周至少包括新年的 4 天。对于一个月的一周,您正在计算星期一(您可能会说一个月的第一周是包括一个月中的 7 天,而不是四天的那一周)。
  • 周数可能并不总是存在。如果您的起点在该月的第 0 周或第 5 周,则前一个月可能没有该周。

  • the results obtained are different from those expected. I think the problem is due to the fact that I didn't specify how to calculate the first week of the month (first Monday of the month). Is it right? How can I solve that?



    我相信你是对的。要计算每月的星期一,您可以使用:
            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 .一个月中对齐的周从该月的 1 号开始,并且始终为 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 周。

    are there better solutions? Can you suggest one?



    我真的不能。我认为你所拥有的很好。

    只有您没有使用 int weekYear范围。您可能想用它代替您的 weekNumber局部变量。在任何情况下,您都应该删除其中一个并使用另一个。

    还有这个不相关的提示:您对 LocalDate.from(someLocalDate) 的使用是多余的,因为它只是给你相同的 LocalDate再次(相同的对象或相等的对象,我不知道也不关心)。只需使用 someLocalDate在那些情况下。

    关于java - 如何使用Java查找一年中#周的所有周数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57561272/

    相关文章:

    objective-c - 在 xcode 标签中创建日期

    sql - 从 "time with time zone"和时区名称获取 "time without time zone"

    file - 使用lua获取文件创建时间

    java - Spring 。如果发生事件,如何手动连接到数据库

    java - Java中的多态

    java - 使用 Axis 客户端忽略无效证书

    javascript - 这真的是JAVASCRIPT中的错误吗,还是Date,数据类型做错了

    java - JComboBox 返回 double 值

    mongodb - MongoDb Date 的 Hive 类型转换

    java - 如何将 double 值格式化为时间