Я хочу получить количество недель в конкретном месяце - программирование

Я хочу получить количество недель в конкретном месяце

я хочу получить количество недель в текущем месяце. Это включает дни предыдущего месяца в последнюю неделю и дни первой недели в следующем месяце.

Примерно так:

Simple Isnt it?

Я хочу использовать это в определенном адаптере gridview на Android и пытаюсь манипулировать этим блоком кода:

            //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)];
    }
4b9b3361

Ответ 1

Атрибут WEEK_OF_YEAR класса Calendar может быть вам полезен. Ссылка: Календарь >

Создайте новую дату, которая будет первым днем ​​месяца. Получите неделю года на этот день, скажем, вы получили начальную ценность.

Создайте новую дату, которая будет последним днем ​​данного месяца. Получите неделю года на этот день, так что теперь вы получили конечную стоимость.

Теперь конец - начало + 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 ));

Для корпуса Corner:

Угловой случай будет происходить только в течение месяца Januaray (например, Jan 2010, январь 2000 года) в тех случаях, когда большинство дней является частью последней недели предыдущего года, поэтому начальное значение будет равно 52, а конечное значение будет 5. Когда это произойдет, проверьте, если,

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

P.S: Поместите его на разные тестовые входы, которые вы получили. Позвольте мне знать, если я могу улучшить его, как только вы обнаружите какую-либо ошибку.

И даже гораздо более простое решение:

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

Log:

        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

Ответ 2

использовать 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

Ответ 3

Мы можем использовать класс календаря, а затем делать что-то вроде

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

это вернет число недель в текущем месяце

Ответ 4

Предположим, что мы знаем первый день месяца (суббота, воскресенье и т.д.).

  • Если 1-й день месяца составляет Sunday, и это не високосный год, то месяц (исправление) February будет иметь только 4 недели. В противном случае во всех случаях он должен иметь не менее 5 и не более 6 недель.
  • Теперь, если ваш месяц начинается с Saturday, у вас всегда будет 6 недель (исключая, если это февраль, когда он будет 5)
  • Теперь, если ваш месяц начинается с Friday, у вас будет 6 недель в течение месяцев, имеющих 31 день и 5 для всех остальных.
  • Для остальных случаев это всегда будет 5 недель.

Выяснить 1-й день месяца не должно быть сложно, вы можете использовать Calendar или другие классы библиотеки функций даты и времени. Тем не менее, я думаю, что могут быть более чистые решения, устраняющие угловые случаи и ненужную сложность.

Ответ 5

если вы хотите сделать это с помощью "руки"

используйте это:

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 - это просто целое число, которое корректирует месяц, который вы ищете, по сравнению с сегодняшней датой.