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

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

像这样的东西:

简单是不是? http://sofzh.miximages.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)]; } 

Solutions Collecting From Web of "我想得到一个特定月份的周数"

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。