Нахождение номера недели по дате java

81
24 апреля 2021, 03:00

Есть график на две недели , то есть с 1 сентября у нас начинается первая неделя , потом следующая вторая, а потом следующая опять первая. Подскажите как средствами java реализовать алгоритм который будет определять какая сейчас неделя по графику получая на вход текущую дату. Заранее благодарен.

Answer 1

Например, так:

    Date start = null;
    try {
        start = new SimpleDateFormat("dd/MM/yyyy").parse("01/09/2019"); //получим дату 1-го сентября 2019
    } catch (ParseException exc) {
        exc.printStackTrace();
    }
    long delay = System.currentTimeMillis() - start.getTime(); //получим разницу (в мс) между сегодня и 1-ым сентября
    long week = 1000 * 60 * 60 * 24 * 7; //кол-во миллисекунд в одной неделе
    delay %= week * 2; //найдем остаток от деления разницы на две недели
    if (delay <= week) System.out.println("First week"); //если разница меньше либо равна одной неделе, то это первая неделя
    else System.out.println("Second week"); //иначе вторая
Answer 2

Воспользоваться классом Calendar, получить номер недели и посмотреть, является ли он четным или нечетным.

public Boolean IsOdd(Date date){
    Calendar calendar = new GregorianCalendar();
    calendar.setTime(new Date());
    return calendar.get(Calendar.WEEK_OF_MONTH) % 2 != 0;
}
Answer 3
import java.time.LocalDate;
import static java.time.temporal.ChronoUnit.WEEKS;
public class Main {    
    public static void main(String[] args) {        
        System.out.println(isFirstWeek(LocalDate.of(2019, 9, 10)));
    }    
    public static boolean isFirstWeek (LocalDate date) {
        return date.getMonthValue()>=9 ? 
                WEEKS.between(date.withMonth(9).withDayOfMonth(1), date)%2==0 : 
                WEEKS.between(date.withMonth(9).withDayOfMonth(1).minusYears(1), date)%2==0;
    }    
}

Я так понимаю, что речь идет об расписании на учебный год. Это вариант всегда считает недели как 1 сентября + 7 дней, учитывая, что учебный год не равен календарному, т.е., к примеру, 5 сентября 2019 и 5 марта 2020 - это разные календарные годы, но один учебный. Все это корректно с точки зрения временного промежутка. Вместе с тем, если Вам нужно учитывать дни недели, то это неверное решение. Например, 1 сентября 2019 года это воскресенье. Следовательно, 1 неделю следует отсчитывать с понедельника 2 сентября. Однако, если бы 1 сентября пришлось, например, на четверг, то первая неделя состояла бы только из 4 дней с четверга по воскресенье включительно. Если Вам нужно именно это , то метод следует несколько изменить:

public static boolean isFirstWeek (LocalDate date) {        
    final LocalDate firstMonday = date.getMonthValue()>=9 ? 
            date.withMonth(9).withDayOfMonth(1).minusDays(date.getDayOfWeek().getValue()-1) : 
            date.withMonth(9).withDayOfMonth(1).minusDays(date.getDayOfWeek().getValue()-1).minusYears(1);          
    return firstMonday.minusDays(firstMonday.getDayOfWeek().getValue()-1).isBefore(firstMonday) ? 
            WEEKS.between(firstMonday, date)%2==0 : WEEKS.between(firstMonday, date)%2!=0;
} 
READ ALSO
Создание спецификации в цикле

Создание спецификации в цикле

Всем привет, такой вопросЕсть список который может содержать более 1000 элементов, по которому надо сделать сравнение

97
Одна Entity и Две @OneToOne анотации

Одна Entity и Две @OneToOne анотации

В таблице Location содержится информация которая должна выбираться согласно связи charactersorigin_id reference to location

108
Как докачать расширения в Android Studio?

Как докачать расширения в Android Studio?

При первом запуске Android Studio возникает окно, с помощью которого можно установить все необходимые расширения, но после создания первого проекта,...

94