【问题标题】:How to get week numbers of a certain month? [closed]如何获取某个月份的周数? [关闭]
【发布时间】:2010-10-25 11:02:17
【问题描述】:

我只是想问一下获取某个月份的周数的有效方法是什么。我有一个带有月份和年份作为参数的函数,函数的返回值应该是一个包含特定月份的周数的 int 数组。(如下所示...)

public int[] getWeeksOfMonth(int month, int year){
            //what's the efficient way to implement this??
}

【问题讨论】:

标签: java


【解决方案1】:

Calendar 类的WEEK_OF_YEAR 属性对你很有用。

创建一个新日期,该日期将是给定月份的第一天。获取这一天的一年中的第几周,假设您获得了start 值。

创建一个新日期,该日期将是给定月份的最后一天。获取这一天的一年中的第几周,所以现在您获得了 end 值。

最后,创建一个简单的int[],其中包含从startend 的值。

【讨论】:

  • 您不必遍历整个月。看看第一天的一周,比如s,和最后一天的一周,比如e,并构建包含e-s+1值的数组,从se
  • @Flinsch 是的,你是对的。我已经更新了我的答案。
  • Flinsch:这并不适用于所有情况。例如,参见 2010 年 1 月。一年中的前三天属于第 53 周。第四天属于第 1 周。
  • 你是对的,对不起。因此,您需要对s>e(仅适用于一月)进行特殊情况处理,如下所示:如果s>e:构建数组,如{ s, 1, ..., e }。否则:构建数组,如{ s, ..., e }
【解决方案2】:

日历 cal = Calendar.getInstance();

int maxWeeknumber = cal.getActualMaximum(Calendar.WEEK_OF_MONTH);

【讨论】:

  • 这告诉你某个月有多少周,通常从 5 到 6 不等(2 月除外,可能只有 4 周)
  • 但这在用户更改日期格式的一种情况下不起作用。我对此只有一个悬而未决的问题。 stackoverflow.com/questions/61537895/… 对此的任何回答表示赞赏。
【解决方案3】:

我不确定您是否要返回一个长度等于该月的天数的数组,每个值都是相应日期的周数,还是一个包含所有不同的数组> 指定月份中的天数。假设是前者,这应该可行:

public static int[] getWeeksOfMonth(int month, int year)
{
    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.YEAR, year);
    cal.set(Calendar.MONTH, month);
    cal.set(Calendar.DAY_OF_MONTH, 1);

    int ndays = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
    int weeks[] = new int[ndays];
    for (int i = 0; i < ndays; i++)
    {
        weeks[i] = cal.get(Calendar.WEEK_OF_YEAR);
        cal.add(Calendar.DATE, 1);
    }
    return weeks;
}

如果您想要指定月份中各天的不同周数数组:

public static Integer[] getWeeksOfMonth(int month, int year)
{
    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.YEAR, year);
    cal.set(Calendar.MONTH, month);
    cal.set(Calendar.DAY_OF_MONTH, 1);

    Set<Integer> weeks = new HashSet<Integer>();
    int ndays = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
    for (int i = 0; i < ndays; i++)
    {
        weeks.add(cal.get(Calendar.WEEK_OF_YEAR));
        cal.add(Calendar.DATE, 1);
    }

    return weeks.toArray(new Integer[0]);
}

(请注意,最后一个示例返回一个 Integer 对象数组,但修改它以返回一个 int 数组是微不足道的)

【讨论】:

    【解决方案4】:

    我认为,这是更简单的方法:

    Calendar now = Calendar.getInstance();
    
    System.out.println("Current week of month is : " +
                now.get(Calendar.WEEK_OF_MONTH));
    

    【讨论】:

      【解决方案5】:
      1. 为 一个月的第一天和最后一天。
      2. 然后在每个实例上调用get(Calendar.WEEK_OF_YEAR)
      3. 步骤 [2] 将返回周的开始和结束索引

      【讨论】:

      • 请注意,可能会发生这种情况(结束索引
      • 嗯 - 怎么样?只要是我们处理的同一个月,endIndex
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多