2013-03-10 17 views
6

Co szukam jest stworzenie tablicę dni tygodnia w języku Java, zaczynając od wczoraj i przejdź do sześciu dni czasu jako takiegoJava - Get tablicę imię dzień dla bieżącego tygodnia

String daysWeek[] = { "Yesterday", "Today", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday"}; 

Pierwsze dwa elementy tablicy, które chcę zwrócić jako wczoraj i dziś.

Początkowo wydawało się to łatwe zadanie, używając

currentDay = Calendar.getInstance().get(Calendar.DAY_OF_WEEK); 

String daysList[] = {"Sunday", "Monday", "Tuesday", "Wednesday", 
      "Thursday", "Friday", "Saturday"}; 

String daysWeek[] = {"Yesterday", "Today", daysList[currentDay], daysList[currentDay+1], ...}; 

Uwaga na powyższym daysList[currentDay] powróci jutro od tablicy daysList startów na 0 czyli jeśli currentDay = 3 który mówi dzisiaj jest wtorek to będzie to daysList[2] .

Ale mój problem polega na tym, że jeśli currentDay wynosi 7, co oznacza, że ​​dziś jest sobota, to currentDay+1, który jest jutro, będzie ósmym elementem tablicy, który nie istnieje.

Czy są jakieś, które mogę w pętli wokół moich liczb, że jeśli dziś jest środa lub później, raz currentDay + x > 7, ustaw currentDay z powrotem na 1?

Wszystko to odbywa się w jednej metodzie, która nazywa się getDaysList(currentDay), która zwraca tablicę daysWeek[].

+1

Odpowiedź WChargin ma rację. Chciałbym tylko wiedzieć, dlaczego chcesz to zrobić. Używanie tablic często jest oznaką złego projektowania obiektowego. Może twój kod mógłby zostać refaktoryzowany. Jeśli chciałbyś wyjaśnić swój cel przechowywania dni tygodnia w tablicy, być może moglibyśmy znaleźć lepsze rozwiązanie (lub zrozumieć, że twoje rozwiązanie jest najlepsze). – Martin

Odpowiedz

7

Ta funkcja służy tutaj: modulo (%).

Zasadniczo to, co robi operator modulo, zajmuje resztę podziału, który jest dokładnie tym, czego potrzebujesz. (Pamiętaj powrotem w czwartej klasie, gdy „9/2” był nie 4,5, ale 4 pozostała 1 To jest ta część pozostała?).

Więc zamiast:

days[currentDay + x] 

Zastosowanie:

days[(currentDay + x) % 7] 

Krótki przykład na wartościach zwracanych przez operatora modulo:

0 % 7 = 0 (0/7 = 0 R0) 
1 % 7 = 1 (1/7 = 0 R1) 
6 % 7 = 6 (6/7 = 0 R6) 
7 % 7 = 0 (7/7 = 1 R0) 
8 % 7 = 1 (8/7 = 1 R1) 
15 % 7 = 1 (15/7 = 2 R1) 
+0

Wielkie dzięki, zapomniałem o tej notacji. – ChrisAF

1

można użyć operatora pozostałej części (%):

6 % 7 == 6 
7 % 7 == 0 
8 % 7 == 1 
1

tl; dr

LocalDate.now(ZoneId.of("Pacific/Auckland")) 
     .plusDays(5) 
     .getDayOfWeek() 
     .getDisplayName(TextStyle.FULL , Locale.US) 

Szczegóły

Zdobądź swój umysł od idei indeksu tablicy dotyczącej dzień-of-tygodnia.

Ogólnie, lepiej jest używać obiektu modern collection object do zbierania obiektów niż zwykłej tablicy.

Należy również unikać kłopotliwej klasy Calendar. Teraz wyparte przez klasy java.time.

Najpierw pobierz aktualną datę. 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.

Określ proper time zone name w formacie continent/region, takich jak America/Montreal, Africa/Casablanca lub Pacific/Auckland. Nigdy nie używaj skrótu 3-4-literowego, takiego jak EST lub IST, ponieważ są one rzeczywistymi strefami czasowymi, nie są standaryzowane, a nawet unikalne (!).

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

Wiemy wynik na wczoraj jest yesterday więc nie ma potrzeby, aby obliczyć tę datę. Jeśli potrzebujesz daty, zadzwoń pod numer LocalDate::minusDays.

Możemy poprosić każdy znak LocalDate o nazwę jego dnia, wyodrębniając obiekt wyliczeniowy DayOfWeek. Ten DayOfWeek jest w stanie określić za pomocą obiektu Locale. Nie musisz więc śledzić tablicy łańcuchów nazw wzorcowych dni. Wskazówka: W OOP spróbuj pomyśleć: (a) pozwalając obiektom być inteligentnymi dbać o siebie, lub (b) pozyskując pomoc obiektu pomocnika, zamiast używać podstawowych tablic do samodzielnego wykonania całej pracy.

List<String> dayNames = new ArrayList<>(7) ; // Initialize to seven days of a week. 
dayNames.add("yesterday") ; 
dayNames.add("today") ; 
for(int i = 1 ; i <= 5 ; i ++) { 
    LocalDate ld = today.plusDays(i) ; 
    String dayName = ld.getDayOfWeek().getDisplayName(TextStyle.FULL , Locale.US) ; 
    dayNames.add(dayName) ; // Add each of the five days remaining in a week. 
} 

Spróbuj tego code live in IdeOne.com.

[wczoraj, dziś, wtorek, środa, czwartek, piątek, sobota]


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 klas 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?

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.