2011-01-09 7 views
20

To, co ten kod wykonuje, to drukowanie dat bieżącego tygodnia od poniedziałku do piątku. Działa to dobrze, ale chcę zapytać o coś innego: jeśli dziś jest sobota lub niedziela, chcę, żeby pokazała się w przyszłym tygodniu. Jak mogę to zrobić?Jak sprawdzić, czy jest sobota/niedziela?

Oto mój kod roboczych tak daleko (dzięki 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); 
} 

Dzięki wielkie! Naprawdę doceniam to, jak byłem szukając rozwiązania godzinami ...

Odpowiedz

23
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's Friday so skip to Monday 
      c.add(Calendar.DATE, 3); 
     } else if (dayOfWeek == Calendar.SATURDAY) { // If it's 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); 
    } 
} 

Wyjście

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 

Jeśli chcesz być słodkie można wymienić jeśli/wtedy/else z

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

ale naprawdę chciałem coś zrozumiałego i czytelnego.

+0

dzięki za odpowiedź! Jeśli go uruchomię, oznacza to, że dzień tygodnia to 2 (tutaj jest niedziela). Więc włożyłem to do tego i poniedziałek zaczyna się od 3 .... czy to prawda? – Cristian

+0

DZIĘKI DUŻO CZŁOWIEK !!!!! – Cristian

+6

Może użyjesz "dayOfWeek == Calendar.FRIDAY" zamiast "dayOfWeek == 6" itd.? –

7

tl; dr Kod

Rdzeń pojęcia:

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

java.time

Nowoczesny sposób jest z klasami java.time.

Wyliczenie DayOfWeek zawiera siedem obiektów, od poniedziałku do niedzieli.

Klasa LocalDate reprezentuje wartość tylko dla daty bez pory dnia i bez strefy czasowej.

Strefa czasowa ma kluczowe znaczenie przy ustalaniu daty. W danym momencie data zmienia się na całym świecie według strefy. Na przykład kilka minut po północy w Paris France jest nowy dzień, a jednocześnie "wczoraj" w Montréal Québec.

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

Określ weekend jako zbiór obiektów DayOfWeek. Zauważ, że EnumSet to szczególnie szybka i mało pamięci implementacja Set zaprojektowana do przechowywania obiektów Enum, takich jak DayOfWeek.

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

Teraz możemy sprawdzić, czy dziś jest dzień tygodnia czy weekend.

Boolean todayIsWeekend = weekend.contains(dow); 

Pytanie brzmiało, że chcemy skoczyć na początek następnego tygodnia, jeśli jest to weekend. Aby to zrobić, użyj parametru TemporalAdjuster, który zapewnia klasy, które mogą manipulować obiektami typu data-czas. W java.time mamy immutable objects. Oznacza to, że tworzymy nowe instancje oparte na wartościach wewnątrz istniejącego obiektu, zamiast zmieniać ("mutować") oryginał. Klasa TemporalAdjusters (zwróć uwagę na liczbę mnogą "s") zapewnia kilka użytecznych implementacji TemporalAdjuster, w tym next(DayOfWeek).

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

Kod miękki długości tygodnia na wypadek, gdyby nasza definicja weekendu kiedykolwiek się zmieniała.

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); 
} 

Zobacz live code in IdeOne.com.


O java.time

Ramy java.time jest wbudowana w Java 8 i późniejszych. Klasy te zastępują kłopotliwe stare klasy z datami, takie jak java.util.Date, Calendar, & SimpleDateFormat.

Projekt Joda-Time, teraz w maintenance mode, zaleca migrację do java.time. Aby uzyskać więcej informacji, zobacz

. I wyszukaj Stack Overflow dla wielu przykładów i objaśnień. Specyfikacja to JSR 310.

Gdzie można uzyskać lekcje java.time?

  • Java SE 8 i SE 9 a później
    • wbudowanej.
    • Część standardowego interfejsu API języka Java z pakietem implementacji.
    • Java 9 dodaje kilka drobnych funkcji i poprawek.
  • Java SE 6 i SE 7
    • Znaczna część funkcjonalności java.time jest back-przeniesiony do Java 6 & 7 w ThreeTen-Backport.
  • Android
    • Projekt ThreeTenABP dostosowuje ThreeTen-backportu (wymienione powyżej) Androida szczegółowo.
    • Zobacz How to use….

Projekt ThreeTen-Extra rozciąga java.time z dodatkowych zajęć. Ten projekt jest poligonem wskazującym na możliwe przyszłe dodatki do java.time. Możesz znaleźć tutaj kilka użytecznych klas, takich jak Interval, YearWeek, YearQuarter i more.

Powiązane problemy