2012-09-21 15 views
5

Me gustaría saber en qué semana del mes cae un día en particular. Por ejemplo, 20-sep-2012 cae en la 4ª semana de septiembre, pero el código siguiente lo muestra como 3, que no es correcto. El sistema divide los días por 7 y devuelve la salida y no es lo que requiero. He buscado en Joda API pero no he podido encontrar la solución. Por favor, hágamelo saber ¿hay alguna manera de averiguar la semana de un mes, un día caeCómo encontrar la semana del mes

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

"... que no es requiero" - bueno, entonces ¿qué es exactamente * * Qué necesita? Obtenga esas reglas claras, y luego puede escribirlas en código Java. – Jesper

Respuesta

7

Esto se debe a dos razones:

El primero es este (desde el API):

la primera semana de un mes o un año se define como el primer período de siete días a partir de getFirstDayOfWeek() y que contiene al menos getMinimalDaysInFirstWeek() días

El valor por defecto de este varía (el mío era 4), pero puede establecer esto a su valor preferido con

Calendar.setMinimalDaysInFirstWeek()

La segunda razón es la que @Timmy crió en su respuesta. Debe realizar ambos cambios para que su código funcione. Ejemplo de trabajo completa:

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

Esto imprime

Week of Month :4 
+0

invocando ca1.setMinimalDaysInFirstWeek (2); todavía está regresando como 3. Estaba tratando de averiguar si hay alguna API estándar, pero creo que no existe una API en Calendar o fecha Joda. Llegué a la conclusión de que tengo que escribir el código para determinar la semana de un mes de un día en particular – user1686408

+0

He aceptado su respuesta y funciona – user1686408

3

Mes está basado en cero. Entonces, ca1.set (2012, 9, 20) está configurando el calendario en octubre.

+0

Al configurar el mes, sigue mostrando la semana como 3 y no como 4 ca1.set (2012, Calendar.SEPTEMBER, 20); – user1686408

+0

Extraño. En mi máquina, devuelve 4. – Timmy

1

Para asegurarse de que está configurado el mes correcto, intente utilizar las constantes de mes provistas por la clase Calendar.

-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

Para aquellos que trabajan con el tiempo Joda, esto es lo que estoy utilizando:

/** 
* 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; 
} 
Cuestiones relacionadas