2012-09-21 14 views
5

Chciałbym wiedzieć, w którym tygodniu miesiąca spadnie dany dzień. Na przykład 20 września 2012 przypada w czwartym tygodniu września, ale poniższy kod wyświetla go jako 3, co nie jest poprawne. System dzieli dni przez 7 i zwraca dane wyjściowe, które nie są mi potrzebne. Szukałem w API Jody, ale nie mogłem znaleźć rozwiązania. Proszę dać mi znać, czy jest jakiś sposób, aby dowiedzieć się tydzień w miesiącu, dzień przypadaJak znaleźć tydzień miesiąca?

Calendar ca1 = Calendar.getInstance(); 

    ca1.set(2012,9,20); 

    int wk=ca1.get(Calendar.WEEK_OF_MONTH); 
    System.out.println("Week of Month :"+wk); 
+1

„... który nie wymagam” - dobrze, to co dokładnie * nie * wymagać? Wyjaśnij zasady, a następnie zapisz je w kodzie Java. – Jesper

Odpowiedz

7

Wynika to z dwóch powodów:

Pierwszym z nich jest to (od API):

w pierwszym tygodniu miesiąca lub roku jest zdefiniowany jako najwcześniejszego okresu siedmiu dni rozpoczynającego się getFirstDayOfWeek() i zawierające co najmniej getMinimalDaysInFirstWeek() dni

Domyślna wartość ta waha się (mój był 4), ale można ustawić to do preferowanej wartości z

Calendar.setMinimalDaysInFirstWeek()

Drugi powód jest jeden @Timmy wychowana w swojej odpowiedzi. Aby kod działał, musisz wykonać obie zmiany. Kompletny przykład praca:

public static void main(String[] args) { 
    Calendar ca1 = Calendar.getInstance(); 
    ca1.set(2012, Calendar.SEPTEMBER, 20); 
    ca1.setMinimalDaysInFirstWeek(1); 
    int wk = ca1.get(Calendar.WEEK_OF_MONTH); 
    System.out.println("Week of Month :" + wk); 
} 

Drukuje

Week of Month :4 
+0

Poprzez wywołanie ca1.setMinimalDaysInFirstWeek (2); wciąż powraca jako 3. Próbowałem dowiedzieć się, czy istnieje jakiś standardowy interfejs API, ale myślę, że nie istnieje API w Kalendarzu lub Dacie Jody. Doszedłem do wniosku, że muszę napisać kod, aby określić tydzień miesiąca danego dnia. – user1686408

+0

Zaakceptowałem twoją odpowiedź i działa – user1686408

3

miesiąc jest od zera. Zatem ca1.set (2012,9,20) faktycznie ustawia kalendarz na październik.

+0

Ustawiając miesiąc, wciąż wyświetla tydzień jako 3, a nie 4 ca1.set (2012, Calendar.SEPTEMBER, 20); – user1686408

+0

Dziwne. Na moim komputerze zwraca 4. – Timmy

1

Aby upewnić się, że ustawiony jest prawidłowy miesiąc, spróbuj użyć stałych miesięcznych dostarczonych przez klasę kalendarza.

-1
class test { 
    public static void main(String[] args){ 
     Calendar cal = Calendar.getInstance();  
     cal.set(2016, Calendar.AUGUST, 01); 
     printDayOFWeek(cal, Calendar.MONDAY, 5);//prints monday on 5th week 
    } 
} 

private static void printDayOFWeek(Calendar cal, int day, int whatweek) { 
    cal.set(Calendar.DAY_OF_WEEK, day);//day = Mon, tue, wed,..etc 
    cal.set(Calendar.DAY_OF_WEEK_IN_MONTH, -1); //-1 return last week 

    Date last = cal.getTime(); 
    cal.set(Calendar.DAY_OF_WEEK_IN_MONTH, whatweek); 

    Date one = cal.getTime(); 
    if(one.before(last) || one.compareTo(last) ==0) 
    { 
     System.out.println(whatweek +"WEEK" + cal.getTime()); 
    } 
} 
0

dla osób pracujących w czasie Joda, to co używam:

/** 
* For a week starting from Sunday, get the week of the month assuming a 
* valid week is any week containing at least one day. 
* 
* 0=Last,1=First,2=Second...5=Fifth 
*/ 
private int getWeekOfMonth(MutableDateTime calendar) 
{ 
    long time = calendar.getMillis(); 
    int dayOfMonth = calendar.getDayOfMonth(); 
    int firstWeekday; 
    int lastDateOfMonth; 
    int week; 
    int weeksInMonth; 

    calendar.setDayOfMonth(1); 
    firstWeekday = calendar.getDayOfWeek(); 
    if (firstWeekday == 7) 
    { 
     firstWeekday = 0; 
    } 
    calendar.setHourOfDay(0); 
    calendar.addMonths(1); 
    calendar.addDays(-1); 
    lastDateOfMonth = calendar.getDayOfMonth(); 
    weeksInMonth = (int)Math.ceil(1.0*(lastDateOfMonth + firstWeekday)/7); 
    week = (byte)(1 + (dayOfMonth + firstWeekday - 1)/7); 
    week = (week == weeksInMonth)?0:week; 
    calendar.setMillis(time); 

    return week; 
} 
Powiązane problemy