Java 我想得到一个月的周数

Java 我想得到一个月的周数,java,android,calendar,Java,Android,Calendar,我想得到本月的周数,包括上个月最后一周的天数和下个月的第一周天数 大概是这样的: 我想在android上的某个gridview适配器中使用它,并尝试操作此代码块: //FIRST_DAY_OF_WEEK =0; int lastDay = month.getActualMaximum(Calendar.DAY_OF_MONTH); int firstDay = (int) month.get(Calendar.DAY_OF_WEEK); int

我想得到本月的周数,包括上个月最后一周的天数和下个月的第一周天数

大概是这样的:

我想在android上的某个gridview适配器中使用它,并尝试操作此代码块:

            //FIRST_DAY_OF_WEEK =0;
    int lastDay = month.getActualMaximum(Calendar.DAY_OF_MONTH);
    int firstDay = (int) month.get(Calendar.DAY_OF_WEEK);
    int firstDayNextMonth = nextMonth.get(Calendar.DAY_OF_WEEK);
    int lastDayNextMonth=nextMonth.getActualMaximum(Calendar.DAY_OF_MONTH);
    int nextMonthdays=nextMonth.getMinimalDaysInFirstWeek();

    // figure size of the array
    if (firstDay == 1) {
        days = new String[lastDay + (FIRST_DAY_OF_WEEK * 6)];
    }

    else {
        days = new String[lastDay + firstDay - (FIRST_DAY_OF_WEEK + 1)];
    }

Calendar类的WEEK\u OF_YEAR属性对您很有用。参考:

创建一个新日期,该日期将是某个月的第一天。为这一天获取一年中的一周,假设您获得了起始值

创建一个新日期,该日期将是给定月份的最后一天。获取这一天的一周,这样现在就得到了终值

现在end-start+1应该是您想要的

        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.YEAR, 2013);
        cal.set(Calendar.MONTH, 1);
        cal.set(Calendar.DAY_OF_MONTH, 1);
        int start = cal.get(Calendar.WEEK_OF_YEAR);
        Log.d("BLA BLA", "Value is " + start);
        cal.set(Calendar.YEAR, 2013);
        cal.set(Calendar.MONTH, 1);
        cal.set(Calendar.DAY_OF_MONTH, 28);
        int end = cal.get(Calendar.WEEK_OF_YEAR);
        //Above line will not work for December Month, use following line for this
        int end = isDecember?53:cal.get(Calendar.WEEK_OF_YEAR);
        Log.d("BLA BLA", "Value is " + end);
        Log.d("BLA BLA", "Num weeks:: " + (end - start +1 ));
当一周与另一年或类似的时间重叠时,你可能不得不处理一些紧急情况。但我认为一旦你做对了,你可以用简单的逻辑来做

下面是简单的示例代码。我认为你可以把它变成函数,传递你想要的任何东西

        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.YEAR, 2013);
        cal.set(Calendar.MONTH, 1);
        cal.set(Calendar.DAY_OF_MONTH, 1);
        int start = cal.get(Calendar.WEEK_OF_YEAR);
        Log.d("BLA BLA", "Value is " + start);
        cal.set(Calendar.YEAR, 2013);
        cal.set(Calendar.MONTH, 1);
        cal.set(Calendar.DAY_OF_MONTH, 28);
        int end = cal.get(Calendar.WEEK_OF_YEAR);
        //Above line will not work for December Month, use following line for this
        int end = isDecember?53:cal.get(Calendar.WEEK_OF_YEAR);
        Log.d("BLA BLA", "Value is " + end);
        Log.d("BLA BLA", "Num weeks:: " + (end - start +1 ));
对于拐角处的情况:

        Calendar cal = Calendar.getInstance();
        for(int i = 0 ; i < 11;i++){
            cal.set(Calendar.YEAR, 2013);
            cal.set(Calendar.DAY_OF_MONTH, 1);
            cal.set(Calendar.MONTH, i);
            int maxWeeknumber = cal.getActualMaximum(Calendar.WEEK_OF_MONTH);
            Log.d("LOG","max week number" + maxWeeknumber);
        }

        01-22 01:49:03.591: D/LOG(573): max week number5
        01-22 01:49:03.602: D/LOG(573): max week number5
        01-22 01:49:03.602: D/LOG(573): max week number6
        01-22 01:49:03.671: D/LOG(573): max week number5
        01-22 01:49:03.671: D/LOG(573): max week number5
        01-22 01:49:03.671: D/LOG(573): max week number6
        01-22 01:49:03.681: D/LOG(573): max week number5
        01-22 01:49:03.691: D/LOG(573): max week number5
        01-22 01:49:03.691: D/LOG(573): max week number5
        01-22 01:49:03.711: D/LOG(573): max week number5
        01-22 01:49:03.711: D/LOG(573): max week number5
        Calendar cal = Calendar.getInstance();
        for(int i = 0 ; i < 11;i++){
            cal.set(Calendar.YEAR, 2010);
            cal.set(Calendar.DAY_OF_MONTH, 1);
            cal.set(Calendar.MONTH, i);
            int maxWeeknumber = cal.getActualMaximum(Calendar.WEEK_OF_MONTH);
            // Month value starts from 0 to 11 for Jan to Dec
            Log.d("LOG","For Month :: "+ i + " Num Week :: " + maxWeeknumber);
        }
角点情况仅发生在1月份(例如2010年1月、2000年1月),在这些情况下,大多数天数是前一年最后一周的一部分,因此起始值为52,结束值为5。发生这种情况时,请检查

          if(start > end) {
                numweeks = end + 1;
             }
附言:把它放到你得到的不同测试输入中。如果您发现任何问题,请告诉我是否可以改进

甚至更简单的解决方案:

        Calendar cal = Calendar.getInstance();
        for(int i = 0 ; i < 11;i++){
            cal.set(Calendar.YEAR, 2013);
            cal.set(Calendar.DAY_OF_MONTH, 1);
            cal.set(Calendar.MONTH, i);
            int maxWeeknumber = cal.getActualMaximum(Calendar.WEEK_OF_MONTH);
            Log.d("LOG","max week number" + maxWeeknumber);
        }

        01-22 01:49:03.591: D/LOG(573): max week number5
        01-22 01:49:03.602: D/LOG(573): max week number5
        01-22 01:49:03.602: D/LOG(573): max week number6
        01-22 01:49:03.671: D/LOG(573): max week number5
        01-22 01:49:03.671: D/LOG(573): max week number5
        01-22 01:49:03.671: D/LOG(573): max week number6
        01-22 01:49:03.681: D/LOG(573): max week number5
        01-22 01:49:03.691: D/LOG(573): max week number5
        01-22 01:49:03.691: D/LOG(573): max week number5
        01-22 01:49:03.711: D/LOG(573): max week number5
        01-22 01:49:03.711: D/LOG(573): max week number5
        Calendar cal = Calendar.getInstance();
        for(int i = 0 ; i < 11;i++){
            cal.set(Calendar.YEAR, 2010);
            cal.set(Calendar.DAY_OF_MONTH, 1);
            cal.set(Calendar.MONTH, i);
            int maxWeeknumber = cal.getActualMaximum(Calendar.WEEK_OF_MONTH);
            // Month value starts from 0 to 11 for Jan to Dec
            Log.d("LOG","For Month :: "+ i + " Num Week :: " + maxWeeknumber);
        }

假设我们知道一个月的第一天(周六、周日等)

  • 如果一个月的第一天是一个
    周日
    而不是闰年,那么(修正编辑)
    二月
    月份将只有4周。否则,在所有情况下,应至少有5周,最多6周
  • 现在,如果您的月份从星期六开始,您将有6周的时间(如果是二月,则不包括5周)
  • 现在,如果你的月份从星期五开始,你将有6周的时间,31天,其余5天
  • 对于其他情况,它将始终是5周

找出一个月的第一天应该不难,您可以使用
日历
或其他日期/时间实用程序库类。但是,我想可能会有更干净的解决方案来消除角落案例和不必要的复杂性。

使用每月一周会更好,没有跨年度问题

public static void main(String[] args) throws Exception {
  for (String m : new String[] { "2012-11", "2012-12", "2013-01", "2013-02", "2013-03",
              "2013-04", "2013-05", "2013-06" }) {
      SimpleDateFormat format = new SimpleDateFormat("yyyy-MM");
      Date date = format.parse(m);
      Calendar c = Calendar.getInstance();
      c.setTime(date);

      int start = c.get(Calendar.WEEK_OF_MONTH);

      c.add(Calendar.MONTH, 1);
      c.add(Calendar.DATE, -1);
      int end = c.get(Calendar.WEEK_OF_MONTH);
      System.out.println(" # of weeks in " + format.format(c.getTime())
              + ": " + (end - start + 1));
  }
}
结果:

# of weeks in 2012-11: 5
# of weeks in 2012-12: 6
# of weeks in 2013-01: 5
# of weeks in 2013-02: 5
# of weeks in 2013-03: 6
# of weeks in 2013-04: 5
# of weeks in 2013-05: 5
# of weeks in 2013-06: 6
如果你想用“手”

使用以下命令:

Date.prototype.getMonthWeek = function(monthAdjustement)
{    

    var firstDay = new Date(this.getFullYear(), this.getMonth(), 1).getDay();

    var returnMessage = (Math.ceil(this.getDate()/7) + Math.floor(((7-firstDay)/7)));

    return returnMessage;

}

其中,
monthadjustment
只是一个整数,用于调整您所查找的月份与今天日期的比较。

我们可以使用calendar类,然后执行以下操作

Calendar calendar = Calendar.getInstance();
System.out.println(calendar.getActualMaximum(Calendar.WEEK_OF_MONTH));

这将返回当前月份的周数

Java的日历API对于此类用例非常有用。 参考链接:

我假设你有一个月的开始日期

  • 我们需要使用setTime()设置时间(java.util.Date obj) 因为当您创建Calendar类的实例时,它默认将时间设置为机器的当前时间和日期

    如果您不需要计算某个月的总周数,那么您可以简单地避免第一步。

  • 我们只需要为一个名为 日历。月中的周

    public static int getTotalNumberOfWeeks() throws ParseException {
    
        Calendar calendar = Calendar.getInstance();
    
        Date monthStartingDate = new SimpleDateFormat("yyyy-MM- dd").parse("2021-04-01");
    
        calendar.setTime(monthStartingDate);
    
        return calendar.getActualMaximum(Calendar.WEEK_OF_MONTH);
    }
    
  • 您还可以通过打印日历对象在控制台中查看给定日期的更多详细信息。

    java.time 我建议您在日期工作中使用java.time,即现代的java日期和时间API(坦率地说,我很惊讶地看到,到目前为止还没有任何答案表明这一点)

    让我们首先使用您问题中的示例月份2013年1月进行尝试,这样我们就知道预期结果是5。由于您的工作周从周日开始,我们也在电话中指定:

        System.out.println(getTotalNumberOfWeeks(
                WeekFields.SUNDAY_START, YearMonth.of(2013, Month.JANUARY)));
    
    输出是预期的:

    五,

    关于一个较新的例子,我以2021年5月(下个月)为例。在我居住的地方,我们使用ISO周(从周一开始),让我们也尝试一下:

        System.out.println(getTotalNumberOfWeeks(
                WeekFields.ISO, YearMonth.of(2021, Month.MAY)));
    
    六,

    如果希望在JVM的默认区域设置中使用周,请使用
    WeekFields.of(locale.getDefault())
    作为第一个参数。如果需要当前月份,可以将
    YearMonth.now(ZoneId.systemDefault())
    作为第二个。为了方便起见,我声明了第二个参数a
    Temporal
    。这允许您传递
    LocalDate
    YearMonth
    ZonedDateTime
    、定义月份和年份的任何java.time类

    ISO 8601是可能在世界大部分地区使用的国际标准,它将每月的第一周定义为每月至少有4天的第一周。这意味着在月初的第0周最多有三天。这就是为什么答案只关注月休假的最大周数。相反,我从最大周数中减去最小周数,再加上1,因为我们希望这两周都包含在计数中

    链接
    解释如何使用java.time。

    你的意思是从周日开始到周六结束的一周吗?@Swapnil是的,你是对的,如果选择了周二,你需要确定一个月有多少个周二?@Ramkiran不完全正确。我的场景可能也包括下个月的周二。这样行吗?:
    int rows=Math.ceil(最后一天/7);
    。你能帮我处理我提供的代码块吗。你可以看到,我已经得到了一些你暗示的值。让我试着把它们组合起来,作为例子。我有一个问题要问你。我想让你看看2010年1月的日历。在这种情况下,你期望的周数是多少?这是你要处理的最后一段代码吗ave角落案例证明?我想是soYes,我检查了2010年和2000年的角落案例,效果很好。我也准备把这方面的日志放进去。现在是完整的证明代码;)我想Vendetta提供了一个更干净的解决方案