рассчитать количество недель в данном году - PullRequest
8 голосов
/ 04 января 2012

Я бы хотел узнать количество недель в любом году.Несмотря на то, что 52 принимается как обобщенный ответ по всему миру, календари для 2015, 2020 и 2026 на самом деле имеют 53 недель.

Есть ли способ, которым я могу рассчитать это,или какие-нибудь функции, которые помогут мне?

Ответы [ 9 ]

13 голосов
/ 21 октября 2016

Быстрый два лайнера:

Calendar calendar = Calendar.getInstance();
Integer weeksOfYear = calendar.getActualMaximum(Calendar.WEEK_OF_YEAR);
12 голосов
/ 04 января 2012

Согласно статье в Википедии о формате даты недели ISO , Вы можете рассчитать его, используя следующий код.

    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);
10 голосов
/ 04 января 2012

Вы можете кодировать себя со следующей информацией от Дата недели ISO.

В среднем на год приходится 53 недели каждые 5,6 лет.

Следующие 71 год в 400-летнем цикле (добавьте 2000 для текущих лет) имеют 53 недели. Годы, не указанные в списке, имеют 52 недели.

004, 009, 015, 020, 026, 032, 037, 043, 048, 054, 060, 065, 071, 076, 082, 088, 093, 099, 105, 111, 116, 122, 128, 133 , 139, 144, 150, 156, 161, 167, 172, 178, 184, 189, 195, 201, 207, 212, 218, 224, 229, 235, 240, 246, 252, 257, 263, 268, 274 , 280, 285, 291, 296, 303, 308, 314, 320, 325, 331, 336, 342, 348, 353, 359, 364, 370, 376, 381, 387, 392, 398.

Вы можете использовать вышеуказанную информацию для возврата 52 или 53 соответственно:)

5 голосов
/ 25 ноября 2014

Я хотел бы дать представление об использовании нового API даты в Java 8 со следующим готовым к запуску кодом:

private static long getNumberOfWeeksInYear(LocalDate date) {
    LocalDate middleOfYear = date.withDayOfMonth(1).withMonth(6);
    return middleOfYear.range(WeekFields.ISO.weekOfWeekBasedYear()).getMaximum();
}

public static void main(String[] args) {
    for (int year = 2000; year < 2400; year++) {
        long numberOfWeeks = getNumberOfWeeksInYear(LocalDate.of(year, 1, 1));
        if (numberOfWeeks != 52) {
            System.out.println(year + " has " + numberOfWeeks + " weeks");
        }
    }
}

Вывод:

В 2004 году было 53 недели2009 имеет 53 неделиУ 2015 есть 53 недели2020 имеет 53 недели2026 имеет 53 недели2032 имеет 53 недели...

И так далее ...

Хитрость date.withDayOfMonth(1).withMonth(6); заключается в том, что пропуск этой команды приводит к несколько другому выводу, если передано LocalDate.of(year, 1, 1):

В 2004 году 53 недели2005 год имеет 53 недели...

Я все еще плохо знаком с Java 8 date API, но я уверен, что такое поведение так, потому что 2005-01-01 является частью недели 53 2014. Это составляет date.range(WeekFields.ISO.weekOfWeekBasedYear()).getMaximum() вернуть количество недель для года, основанного на 2014 году.

4 голосов
/ 04 января 2012
    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.YEAR, 2015);
    cal.set(Calendar.MONTH, Calendar.DECEMBER);
    cal.set(Calendar.DAY_OF_MONTH, 31);
    System.out.println(cal.get(Calendar.WEEK_OF_YEAR));
2 голосов
/ 12 августа 2015

Ссылка на ответ

gregorianCalendar.set(year, 12, 31);
int totalWeeks = gregorianCalendar.getMaximum(Calendar.WEEK_OF_YEAR);
1 голос
/ 03 января 2018

Этот метод вычисляет количество недель в году ISO с использованием библиотеки времени Joda.

    import org.joda.time.DateTime;
    import org.joda.time.DateTimeZone;

    public static int weeksInYear(int year) {
        return new DateTime(DateTimeZone.forID("America/Los_Angeles"))
            .withWeekyear(year + 1)
            .withWeekOfWeekyear(1)
            .minusWeeks(1)
            .getWeekOfWeekyear();
    }
1 голос
/ 07 мая 2017

@ Ответ Манджулы Вирасинге на самом деле представляет ошибку на 2016 год. Вот лучшее решение.

Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, year);
cal.set(Calendar.MONTH, Calendar.JANUARY);
cal.set(Calendar.DAY_OF_MONTH, 1);
GregorianCalendar gregorianCalendar = new GregorianCalendar();

int weekDay = cal.get(Calendar.DAY_OF_WEEK) - 1;
if (gregorianCalendar.isLeapYear(year)){
   if (weekDay == Calendar.THURSDAY || weekDay == Calendar.WEDNESDAY)
      return 53;
   else
      return 52;
} else {
   if (weekDay == Calendar.THURSDAY)
      return 53;
   else
      return 52;
}
0 голосов
/ 24 декабря 2018

Для формата даты ISO мы можем рассчитать количество недель следующим образом:

int getNoOfWeeks(int year) {
    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.YEAR, year);
    cal.setMinimalDaysInFirstWeek(4);
    cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
    return cal.getActualMaximum(Calendar.WEEK_OF_YEAR);
}

Таким образом, для года = 2018 он вернет 52, для 2019 года он также вернет 52, но для 2020он вернет 53, поскольку год ISO имеет 52 или 53 недели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...