Как получить общее количество недель в текущем году?

Я получил ниже код в stackoverflow, который возвращает общее количество недель в текущем году, но он жестко запрограммирован, что не будет работать в 2014 и 2016 годах. Как мне динамически получить общее количество недель в текущем году???

Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 2015);
cal.set(Calendar.MONTH, Calendar.DECEMBER);
cal.set(Calendar.DAY_OF_MONTH, 31);

int ordinalDay = cal.get(Calendar.DAY_OF_YEAR);
int weekDay = cal.get(Calendar.DAY_OF_WEEK) - 1; // Sunday = 0
int numberOfWeeks = (ordinalDay - weekDay + 10) / 7;
System.out.println(numberOfWeeks);

Мне понравилось, просто проверьте, это текущий метод?

     Calendar cal = Calendar.getInstance();
     int year = cal.get(Calendar.YEAR);
     cal.set(Calendar.YEAR, year);
     cal.set(Calendar.MONTH, Calendar.DECEMBER);
     cal.set(Calendar.DAY_OF_MONTH, 31);

     int ordinalDay = cal.get(Calendar.DAY_OF_YEAR);
     int weekDay = cal.get(Calendar.DAY_OF_WEEK) - 1; // Sunday = 0
     int numberOfWeeks = (ordinalDay - weekDay + 10) / 7;
     System.out.println(numberOfWeeks);

person user2706686    schedule 26.08.2013    source источник
comment
как??? как я автоматически определяю общее количество лет программно   -  person user2706686    schedule 26.08.2013
comment
этот код говорит, что число дней в месяце равно 31, но в большинстве месяцев 30 дней, а в феврале 28 дней.   -  person user2706686    schedule 26.08.2013
comment
мне понравилось то, что вы говорите, просто проверьте выше, это правильный метод ??   -  person user2706686    schedule 26.08.2013


Ответы (7)


Используйте приведенный ниже код

Calendar mCalendar = new GregorianCalendar(); 
mCalendar.set(Calendar.YEAR, 2014); // Set only year 
mCalendar.set(Calendar.MONTH, Calendar.DECEMBER); // Don't change
mCalendar.set(Calendar.DAY_OF_MONTH, 31); // Don't change
int totalWeeks = mCalendar.get(Calendar.WEEK_OF_YEAR);

Не беспокойтесь о 30, 28 и 29 днях месяца. Последний день года (любого года) всегда 31 декабря. Поэтому вам нужно установить этот день. А mCalendar.get(Calendar.WEEK_OF_YEAR) вернет общее количество недель в этом году.


Обновление для динамического способа

private int getTotalWeeksInYear(int year) {
        Calendar mCalendar = new GregorianCalendar(); 
        mCalendar.set(Calendar.YEAR, year); // Set only year 
        mCalendar.set(Calendar.MONTH, Calendar.DECEMBER); // Don't change
        mCalendar.set(Calendar.DAY_OF_MONTH, 31); // Don't change
        return mCalendar.get(Calendar.WEEK_OF_YEAR);
    }

    // Call as
    int totalWeeks = getTotalWeeksInYear(2014);

Ищем ошибку в приведенном выше коде. К тому времени, когда вы сможете использовать приведенный ниже код, который работает нормально

private int getTotalWeeksInYear(int year) {
        Calendar mCalendar = new GregorianCalendar(TimeZone.getDefault()); 
        mCalendar.setFirstDayOfWeek(Calendar.MONDAY);
        // Workaround
        mCalendar.set(year, 
                Calendar.DECEMBER, 
                31);
        int totalDaysInYear = mCalendar.get(Calendar.DAY_OF_YEAR);
        System.out.println(totalDaysInYear);
        int totalWeeks = totalDaysInYear / 7; 
        return totalWeeks;
    }
person Pankaj Kumar    schedule 26.08.2013
comment
@user2706686 user2706686 ... так что использовать переменную? Вы знаете, как это сделать? - person chrylis -cautiouslyoptimistic-; 26.08.2013
comment
вы можете сделать его переменным. И этот код очень легко преобразовать в динамические способы... в чем проблема с вами? - person Pankaj Kumar; 26.08.2013
comment
я хочу вернуть общее количество недель в году, я думаю, 52 недели в году или что-то в этом роде - person user2706686; 26.08.2013
comment
мне понравилось то, что вы говорите, просто проверьте выше, это правильный метод ?? - person user2706686; 26.08.2013
comment
спасибо за код, на самом деле я создаю приложение, не знаю, в следующем году, сколько недель, так что я могу доверять вашему коду, это идеально? - person user2706686; 26.08.2013
comment
ваш код возвращает 5, который pankaj u написал выше, динамически возвращает 5 - person user2706686; 26.08.2013
comment
В вашем коде ошибка: декабрь — это 11-й, а не 12-й месяц: mCalendar.set(Calendar.MONTH, 11); правильная установка - person Jean-Christophe Blanchard; 19.04.2017
comment
@ Jean-ChristopheBlanchard Да, вы правы. Мы должны использовать Calendar.DECEMBER вместо 11. В моем последнем фрагменте кода я тоже использовал это. Теперь заостренные блоки были обновлены. Спасибо - person Pankaj Kumar; 24.04.2017

просто используйте текущий год в этом методе:

int year = Calendar.getInstance().get(Calendar.YEAR);
cal.set(Calendar.YEAR, year);

Остальные оставьте такими же, как в вашем примере.

person Rebelek    schedule 26.08.2013
comment
но он говорит, что месяцев 31? какой-то месяц 30 или 28 дней - person user2706686; 26.08.2013
comment
что я пишу вместо этой строки cal.set(Calendar.YEAR, 2015); - person user2706686; 26.08.2013
comment
1.) 31 - количество декабрьских дней... 2.)cal.set(Calendar.YEAR, year); - person Rebelek; 26.08.2013
comment
мне понравилось то, что вы говорите, просто проверьте выше, это правильный метод ?? - person user2706686; 26.08.2013

У меня есть DatePickerFragment, его функция onDateSet

public void onDateSet(DatePicker view, int year, int month, int day) {
    ((Main) getActivity()).setWeek(year, month, day);
} 

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

public void getWeek(int year, int month, int day){

        final Calendar c = Calendar.getInstance();
        c.set(year, month, day);
        int week = c.get(Calendar.WEEK_OF_YEAR);            

}
person ksu    schedule 27.08.2013

Вы можете использовать что-то вроде

private Calendar getCalendar(int year, int month, int day) {
    Calendar calendar = Calendar.getInstance(Locale.GERMAN);
    calendar.setFirstDayOfWeek(Calendar.MONDAY);
    calendar.set(year, month, day);
    return calendar;
}

private int getTotalWeeksInYear(int year) {
    return getCalendar(year, Calendar.DECEMBER, 31).get(Calendar.WEEK_OF_YEAR); 
}

Помните, что определение недели года зависит от местных условий. Это означает, что в разных локалях возвращаемое значение get(Calendar.WEEK_OF_YEAR) будет разным. Например, в Locale.GERMAN в соответствии с DIN 1355-1 / ISO 8601 первая неделя года — это неделя, содержащая 4 или более дней в новом году. Для Locale.US первой неделей года является неделя, к которой относится 1 января.

person Sorokin Andrey    schedule 18.07.2014

самый быстрый способ: Очень важно правильно настроить Календарь в зависимости от того, откуда вы, потому что нумерация недель определяется по заданным стандартам. Например, в Европе это ISO 8061. Это означает, что 1 неделя в году начинается, когда 01.01.RRRR приходится на четверг или позже, а неделя начинается с понедельника.

GregorianCalendar gregorianCalendar = new GregorianCalendar(year,12,31);
gregorianCalendar.setFirstDayOfWeek(Calendar.MONDAY); // week beginn from Monday
gregorianCalendar.setMinimalDaysInFirstWeek(4); // 1week mininum from Thursday
int totalWeeks = gregorianCalendar.getMaximum(Calendar.WEEK_OF_YEAR);
person murt    schedule 11.08.2015

Почему бы не использовать getActualMaximum свойство Calendar ?

private int getWeeksCount(final int year, final Locale locale)
{
    Calendar calendar = Calendar.getInstance(locale);
    calendar.set(Calendar.YEAR, year);

    int totalWeekNumber = calendar.getActualMaximum(Calendar.WEEK_OF_YEAR);
    return totalWeekNumber;
}
person Ayaz Alifov    schedule 07.06.2017

Вы можете использовать Calendar.getActualMaximum (int) для получения общего количества недель в текущем году следующим образом:

int totalNumberOfWeeks = Calendar.getInstance().getActualMaximum(Calendar.WEEK_OF_YEAR);

Простой.

person Adil Hussain    schedule 07.09.2017