2012-05-03 26 views
6

Potrzebuję uzyskać liczby wszystkich dni tygodnia (od MON do SUN) w zależności od tego, który dzień jest wysyłany jako parametr.Uzyskaj wszystkie dni bieżącego tygodnia?

Na przykład
Mijam 2 maja i otrzymuję tablicę [30,1,2,3,4,5,6], która faktycznie jest w tym tygodniu.
Albo, zdaję 16 maja i otrzymuję tablicę [14,15,16,17,18,19,20].

Próbowałem użyć tego kodu, ale wraca on 7 dni od dzisiaj, czego nie chcę.

 //get which week of month 
     Calendar now = Calendar.getInstance(); 
     now.set(mYear, mMonth, Integer.parseInt(extractedDay)); 
     int weekOfMonth = now.get(Calendar.WEEK_OF_MONTH); 

     //get all days of clicked week 
     SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy"); 
     Calendar calendar = Calendar.getInstance(); 
     calendar.setFirstDayOfWeek(Calendar.MONDAY); 
     calendar.set(mYear, mMonth, Integer.parseInt(extractedDay)); 

     String[] days = new String[7]; 
     for (int i = 0; i < 7; i++) 
     { 
      days[i] = format.format(calendar.getTime()); 
      calendar.add(Calendar.DAY_OF_MONTH, 1); 
     } 

Ale to nie jest to, czego potrzebuję. Muszę zdać dzisiejszy dzień (Czw) i aby termin ten tygodniu maja - Mon, kwi 30 do Słońca, 6 maja

EDIT

zdałem sobie sprawę, że mam kod, który wykrywa Tydzień miesiąca. Czy istnieje sposób na wykorzystanie tych danych i ustawienie daty na poniedziałek? Na przykład, zdaję 16 maja, a potem wykryję, że jest to 3 tydzień maja, i ustawiam zmienną firstDayOfWeek (nowa zmienna) na 14 maja.

+0

Czy możesz zredukować przykładowy kod do esencji? Nie potrzebujemy kodu "który tydzień miesiąca" i na pierwszy rzut oka zdezorientowało mnie to. –

Odpowiedz

19

Musisz najpierw odjąć tygodnia w ciągu dnia wybrać, aby rozpocząć od pierwszego dnia tydzień. Spróbuj następującego kodu:

public static void main(String[] args){ 
    Calendar now = Calendar.getInstance(); 

    SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy"); 

    String[] days = new String[7]; 
    int delta = -now.get(GregorianCalendar.DAY_OF_WEEK) + 2; //add 2 if your week start on monday 
    now.add(Calendar.DAY_OF_MONTH, delta); 
    for (int i = 0; i < 7; i++) 
    { 
     days[i] = format.format(now.getTime()); 
     now.add(Calendar.DAY_OF_MONTH, 1); 
    } 
    System.out.println(Arrays.toString(days)); 

} 

Dziś wyjście:

[30.04.2012, 05/01/2012, 05/02/2012, 05/03/2012, 4/5/2012, 05.05.2012, 05.06.2012]

+0

to nie działa. działa tylko dla Czw. Po prostu spróbuj inne dni. – sandalone

+0

Właśnie wypróbowałem inne dni w tym tygodniu. Wydaje takie same wyniki. Jakiej daty próbujesz? –

+0

16 maja. Próbuję przez 'now.set (2012, 4, 16)' lub dowolny dzień inny niż Thu – sandalone

1

Będziesz potrzebował użyć tej linii kodu gdzieś w sobie obecny kod:

calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); 

powinien być co najmniej przed pętlą for.

+0

Zrobiłem. Wciąż ten sam wynik. 7 dni przed upływem dnia. – sandalone

0

trzeba ustawić dzień po ustawić datę

calendar.set(mYear, mMonth, Integer.parseInt(extractedDay)); calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);

4

Twoje pytanie zostało już odebrane, ale chciałbym dodać trochę. Kod jest problematyczne na dwa sposoby:

  1. Wykorzystuje różne typy danych dla początkowej daty (mYear jest int i exactDay jest String?).
  2. Łączy parsowanie, formatowanie i generowanie wyniku.

To sprawia, że ​​testowanie kodu jest trudne!

Dlatego proponuję inne podejście:

public class DaysOfCurrentWeek { 
    public static void main(String[] args) { 
     Date refDate = new Date(); 

     Date[] days = getDaysOfWeek(refDate, Calendar.getInstance().getFirstDayOfWeek()); 

     for (Date day : days) { 
      System.out.println(day); 
     } 
    } 

    private static Date[] getDaysOfWeek(Date refDate, int firstDayOfWeek) { 
     Calendar calendar = Calendar.getInstance(); 
     calendar.setTime(refDate); 
     calendar.set(Calendar.DAY_OF_WEEK, firstDayOfWeek); 
     Date[] daysOfWeek = new Date[7]; 
     for (int i = 0; i < 7; i++) { 
      daysOfWeek[i] = calendar.getTime(); 
      calendar.add(Calendar.DAY_OF_MONTH, 1); 
     } 
     return daysOfWeek; 
    } 
} 

Kod działa tak:

  1. Utwórz datę odniesienia (w tym przykładzie tylko za pomocą new Date()).
  2. Zadzwoń pod getDaysOfWeek(), aby wykonać "brudną robotę". Podając firstDayOfWeek, możesz wybrać MONDAY lub SUNDAY jako początek tygodnia. W tym przykładzie używam domyślnego kalendarza.
  3. Zwróć wynik - niesformatowany i jako Date. W ten sposób kod wywołujący może zdecydować, co robić - wydrukować lub wykonać dalsze obliczenia.

Teraz możesz po prostu przetestować metodę getDaysOfWeek(), nie martwiąc się o formatowanie ani sposób utworzenia daty referencyjnej.

Powiązane problemy