我想得到一个特定月份的周数

我想获得当前月份的周数,包括上个月前一个月的天数和下个月的第一个星期天数。

像这样的东西:

简单是不是? http://img.androidcookie.com/java/5ml2de.png

我想在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)]; } 

  • 从日历获取事件
  • Webcal / .ics订阅从Android应用程序内的饲料
  • 在Android中检索默认的日历标识
  • 我如何添加一个新的手机日历到Android?
  • Android - 如何将通知设置为将来的特定date?
  • Android日历获取当前星期几作为string
  • Android日历提供程序:是否有唯一的事件标识符,可用于多个设备?
  • 通过我的应用程序更新和删除android中的日历事件
  • Calendar类的WEEK_OF_YEAR属性可能对您有用。 Ref: 日历课程

    创build一个新的date,这将是一个月的第一天。 得到这一天的一周,假设你有起始价值。

    创build一个新的date,这将是给定月份的最后一天。 得到这一天的一周,所以现在你得到了最终的价值。

    现在结束 – 开始+ 1应该是你想要的。

    当一周重叠到另一年或类似情况时,您可能需要处理一些情况。 但是我认为,一旦你做对了,你可以用简单的逻辑做到这一点。

    这里是简单的示例代码。 我想你可以把它变成function,并通过你想要的任何东西。

      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 )); 

    对于案例:

    在Januaray月份(例如2010年1月,2000年1月),angular落案件只会发生在大部分日子是上一周最后一周的一部分,所以起始值将是52,最终值是5.当这发生检查是否,

      if(start > end) { numweeks = end + 1; } 

    PS:把它放到你得到的不同的testinginput。 让我知道如果我能改善它,一旦你发现任何错误。

    甚至更简单的解决scheme:

      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 

    简单的解决scheme适用于angular落案件:

      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); } 

    日志:

      01-22 01:59:35.841: D/LOG(629): For Month :: 0 Num Week :: 6 01-22 01:59:35.841: D/LOG(629): For Month :: 1 Num Week :: 5 01-22 01:59:35.841: D/LOG(629): For Month :: 2 Num Week :: 5 01-22 01:59:35.841: D/LOG(629): For Month :: 3 Num Week :: 5 01-22 01:59:35.841: D/LOG(629): For Month :: 4 Num Week :: 6 01-22 01:59:35.852: D/LOG(629): For Month :: 5 Num Week :: 5 01-22 01:59:35.871: D/LOG(629): For Month :: 6 Num Week :: 5 01-22 01:59:35.871: D/LOG(629): For Month :: 7 Num Week :: 5 01-22 01:59:35.871: D/LOG(629): For Month :: 8 Num Week :: 5 01-22 01:59:35.871: D/LOG(629): For Month :: 9 Num Week :: 6 01-22 01:59:35.871: D/LOG(629): For Month :: 10 Num Week :: 5 

    使用WEEK_OF_MONTH会更好,没有跨年的问题。

     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 

    我们可以使用日历类,然后做类似的事情

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

    这将返回当前月份的周数

    假设我们知道这个月的第一天(星期六,星期天等)。

    • 如果每个月的第一天是Sunday ,而不是闰年,那么February月份的(修正编辑)将只有4个星期。 否则,在所有情况下,应该至less有5个,最多6个星期。
    • 现在,如果你的月份在Saturday开始,你将会一直有6个星期(不包括如果是2月,那么将会有5个星期)
    • 现在,如果你的月份在Friday开始,你将有六个星期几个月,三十一天,五个星期。
    • 其余的情况下,总是5周。

    找出月份的第一天应该不难,您可以使用Calendar或其他date/时间实用程序库类。 不过,我想可能会有更清晰的解决scheme去除angular落案例和不必要的复杂性。

    如果你想通过“手”来做到这一点,

    用这个:

     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; } 

    哪里monthAdjustement只是一个整数调整你寻求的月份与今天的date。