Подтвердить что ты не робот

Как проверить, суббота или воскресенье?

Что этот код делает, это распечатать даты текущей недели с понедельника по пятницу. Он отлично работает, но я хочу спросить что-то еще: если сегодня суббота или воскресенье, я хочу, чтобы он показывал следующую неделю. Как это сделать?

Вот мой рабочий код до сих пор (спасибо StackOverflow!!):

// Get calendar set to current date and time
Calendar c = Calendar.getInstance();

// Set the calendar to monday of the current week
c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);

// Print dates of the current week starting on Monday to Friday
DateFormat df = new SimpleDateFormat("EEE dd/MM/yyyy");
for (int i = 0; i <= 4; i++) {
    System.out.println(df.format(c.getTime()));
    c.add(Calendar.DATE, 1);
}

Спасибо большое! Я очень ценю это, поскольку я искал решение в течение нескольких часов...

4b9b3361

Ответ 1

public static void main(String[] args) {
    Calendar c = Calendar.getInstance();
    // Set the calendar to monday of the current week
    c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);

    // Print dates of the current week starting on Monday to Friday
    DateFormat df = new SimpleDateFormat("EEE dd/MM/yyyy");
    for (int i = 0; i <= 10; i++) {
        System.out.println(df.format(c.getTime()));
        int dayOfWeek = c.get(Calendar.DAY_OF_WEEK);
        if (dayOfWeek == Calendar.FRIDAY) { // If it Friday so skip to Monday
            c.add(Calendar.DATE, 3);
        } else if (dayOfWeek == Calendar.SATURDAY) { // If it Saturday skip to Monday
            c.add(Calendar.DATE, 2);
        } else {
            c.add(Calendar.DATE, 1);
        }

        // As Cute as a ZuZu pet.
        //c.add(Calendar.DATE, dayOfWeek > Calendar.THURSDAY ? (9 - dayOfWeek) : 1);
    }
}

Выход

Mon 03/01/2011
Tue 04/01/2011
Wed 05/01/2011
Thu 06/01/2011
Fri 07/01/2011
Mon 10/01/2011
Tue 11/01/2011
Wed 12/01/2011
Thu 13/01/2011
Fri 14/01/2011
Mon 17/01/2011

Если вы хотите быть милым, вы можете заменить if/then/else на

c.add(Calendar.DATE, dayOfWeek > 5 ? (9 - dayOfWeek) : 1);

но я действительно хотел, чтобы что-то было легко понятным и читаемым.

Ответ 2

TL;DR

Концепция основного кода:

EnumSet.of( DayOfWeek.SATURDAY , DayOfWeek.SUNDAY )
       .contains( 
            LocalDate.now( ZoneId.of( "America/Montreal" ) )
                     .getDayOfWeek() 
        )

java.time

Современный способ - это классы java.time.

В перечислении DayOfWeek перечислены семь объектов в понедельник-воскресенье.

Класс LocalDate представляет значение даты только без времени и без часового пояса.

Часовой пояс имеет решающее значение для определения даты. В любой данный момент дата изменяется по всему миру по зонам. Например, через несколько минут после полуночи в Париж Франция - это новый день, пока еще "вчера" в Монреаль Квебек.

ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );
DayOfWeek dow = today.getDayOfWeek();

Определите выходные дни как набор объектов DayOfWeek. Обратите внимание, что EnumSet является особенно быстрой и низкоуровневой реализацией Set, предназначенной для хранения объектов Enum, таких как DayOfWeek.

Set<DayOfWeek> weekend = EnumSet.of( DayOfWeek.SATURDAY , DayOfWeek.SUNDAY );

Теперь мы можем проверить, есть ли сегодня рабочий день или выходные.

Boolean todayIsWeekend = weekend.contains( dow );

Вопрос: мы хотим перейти к началу следующей недели, если это выходные. Для этого используйте TemporalAdjuster, который предоставляет классы, которые могут манипулировать объектами с датой. В java.time мы неизменяемые объекты. Это означает, что мы создаем новые экземпляры на основе значений внутри существующего объекта, а не изменяем ( "мутируем" ) оригинал. Класс TemporalAdjusters (обратите внимание на множественное число) предоставляет несколько удобных реализаций TemporalAdjuster, включая next( DayOfWeek ).

DayOfWeek firstDayOfWeek = DayOfWeek.MONDAY ;
LocalDate startOfWeek = null ;
if( todayIsWeekend ) {
    startOfWeek = today.with( TemporalAdjusters.next( firstDayOfWeek ) );
} else {
    startOfWeek = today.with( TemporalAdjusters.previousOrSame( firstDayOfWeek ) );
}

Мы программируем длину недели в случае изменения нашего определения выходных.

LocalDate ld = startOfWeek ;
int countDaysToPrint = ( DayOfWeek.values().length - weekend.size() );
for( int i = 1 ; i <= countDaysToPrint ; i++ ) {
    System.out.println( ld );
    // Set up the next loop.
    ld = ld.plusDays( 1 );
}

Смотрите живой код в IdeOne.com.


О java.time

Структура java.time встроена в Java 8 и более поздних версий. Эти классы вытесняют неприятные старые legacy классы времени, такие как java.util.Date, Calendar и SimpleDateFormat.

Проект Joda-Time, теперь режим обслуживания, советует перейти на java.time.

Чтобы узнать больше, см. Учебник Oracle. И поиск Qaru для многих примеров и объяснений. Спецификация JSR 310.

Где получить классы java.time?

  • Java SE 8 и SE 9 и позже
    • Встроенный.
    • Часть стандартного Java API с объединенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и SE 7
    • Большая часть функциональных возможностей java.time портирована на Java 6 и 7 в ThreeTen-Backport.
  • Android

Проект ThreeTen-Extra расширяет java.time с помощью дополнительных классов. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные классы, такие как Interval, YearWeek, YearQuarter и больше.