2017-01-04 3 views
-1

Я пытаюсь выяснить, сколько понедельников, например, есть в конкретный месяц определенного года. Есть ли библиотека для импорта в java календаря определенного года?Как я могу рассчитать много недельных дней в месяц?

+1

См. Здесь http://stackoverflow.com/q/8040790/6036446 –

+0

@JuanCNuno Не совсем дубликат, так как другой спросил конкретно о библиотеке Joda-Time. –

ответ

2

java.time

Используя java.time классы, встроенные в Java 8 и более поздних версий.

YearMonth month = YearMonth.of(2017, 1); 
LocalDate start = month.atDay(1).with(TemporalAdjusters.nextOrSame(DayOfWeek.MONDAY)); 

int count = (int) ChronoUnit.WEEKS.between(start, month.atEndOfMonth()) + 1; 

System.out.println(count); 
0

Java 7 + JodaTime

import org.joda.time.DateTimeConstants; 
import org.joda.time.Days; 
import org.joda.time.LocalDate; 

import java.util.Date; 

public class Test { 

    public static int getNumberOfMondays(Date start, Date end) { 
     LocalDate startDate = LocalDate.fromDateFields(start); 
     LocalDate endDate = LocalDate.fromDateFields(end); 
     int days = Days.daysBetween(startDate, endDate).getDays(); 
     int mondayCount = 0; 
     //Get number of full weeks: 1 week = 1 Monday 
     mondayCount += days/7; 
     int remainder = days % 7; 
     if (startDate.dayOfWeek().get() == DateTimeConstants.MONDAY || startDate.dayOfWeek().get() > (startDate.dayOfWeek().get() + remainder) % 8) { 
      mondayCount++; 
     } 
     return mondayCount; 
    } 
} 
0

Даже старый `Calendar'-API со всеми его недостатками позволяет решение:

int year = 2017; 
    int month = Calendar.JANUARY; 
    int dow = Calendar.MONDAY; 

    GregorianCalendar gcal = new GregorianCalendar(year, month, 1); 
    while (gcal.get(Calendar.DAY_OF_WEEK) != dow) { 
     gcal.add(Calendar.DAY_OF_MONTH, 1); 
    } 
    System.out.println(gcal.getActualMaximum(Calendar.DAY_OF_WEEK_IN_MONTH)); // 5 

Новый Java-8-API не имеют поле DAY_OF_WEEK_IN_MONTH (в строгом смысле слова), но вы можете сделать это:

int year = 2017; 
    int month = 1; 

    LocalDate ld1 = 
     LocalDate.of(year, month, 1).with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY)); 
    LocalDate ld2 = 
     LocalDate.of(year, month, 1).with(TemporalAdjusters.lastInMonth(DayOfWeek.MONDAY)); 
    System.out.println(ChronoUnit.WEEKS.between(ld1, ld2) + 1); // 5