2010-01-21 64 views
20

Déjame explicarte. Al conocer el número de la semana y el año de una fecha:Cómo obtener el primer día de un número de semana determinado en Java

Date curr = new Date(); 
Calendar cal = Calendar.getInstance(); 
cal.setTime(curr); 
int nweek = cal.WEEK_OF_YEAR; 
int year = cal.YEAR; 

Pero ahora no sé cómo conseguir la fecha del primer día de la semana. He estado buscando en Calendar, Date, DateFormat pero nada que pueda ser útil ...

¿Alguna sugerencia? (trabajando en Java)

Respuesta

38

Esos campos no devuelven los valores. Esas son constantes que identifica los campos en el objeto Calendar que puede obtener/establecer/agregar. Para lograr lo que desea, primero necesita obtener un Calendar, borrarlo y establecer los valores conocidos. Establecerá automáticamente la fecha para el primer día de esa semana.

// We know week number and year. 
int week = 3; 
int year = 2010; 

// Get calendar, clear it and set week number and year. 
Calendar calendar = Calendar.getInstance(); 
calendar.clear(); 
calendar.set(Calendar.WEEK_OF_YEAR, week); 
calendar.set(Calendar.YEAR, year); 

// Now get the first day of week. 
Date date = calendar.getTime(); 

Por favor, aprender a leer la javadocs a aprender a utilizar las clases/métodos/campos y que no trate de meter al azar en su IDE;)

Dicho esto, el java.util.Date y java.util.Calendar son epic failures . Si puede, considere cambiar al Joda Time.

+3

Tenga en cuenta que los números de semana dependen de la configuración regional. ¡Sé absolutamente seguro de que tu ubicación es correcta! –

+1

actualmente usando Joda time, es mucho más fácil trabajar con él, recomendaría cambiarlo –

+0

Gracias, eso es exactamente lo que necesitaba. De todos modos voy a echarle un vistazo a Joda Time como me sugirió. Todavía estoy en el nivel de principiante, aún tengo que aprender mucho. – framara

2

no he hecho mucho Fecha cosas en java, pero una solución podría ser:

cal.set(Calendar.DAY_OF_YEAR, cal.get(Calendar.DAY_OF_YEAR) - cal.get(Calendar.DAY_OF_WEEK)); 

Lógica:

comenzar el día de la semana y restar que a partir de la fecha actual (puede ser que necesite - 1, dependiendo de si necesita que el lunes sea el primer día de la semana o el domingo)

0

Aquí hay algunos códigos rápidos y sucios para hacer esto. Este código crea un objeto de calendario con la fecha del día actual, calcula el día actual de la semana y resta el día de la semana para que esté en el primero (domingo). Aunque estoy usando DAY_OF_YEAR, cumple varios años (el 1/2/10 volverá el 12/27/09, que es el correcto).

import java.text.Format; 
import java.text.SimpleDateFormat; 
import java.util.Calendar; 
import java.util.Date; 


public class DOW { 

    public static void main(String[] args) { 
     DOW dow = new DOW(); 
     dow.doIt(); 
     System.exit(0); 
    } 

    private void doIt() { 
     Date curr = new Date(); 
     Calendar cal = Calendar.getInstance(); 
     cal.setTime(curr); 
     int currentDOW = cal.get(Calendar.DAY_OF_WEEK); 
     cal.add(Calendar.DAY_OF_YEAR, (currentDOW * -1)+1); 

     Format formatter = new SimpleDateFormat("MM/dd/yy"); 
     System.out.println("First day of week="+formatter.format(cal.getTime())); 
    } 
} 
0

Tenga cuidado con los que, calendar.get(Calendar.WEEK_OF_YEAR) devuelve 1 si se trata de fines de diciembre y ya una semana que termina en el próximo año.

Usando

//   cal2.set(Calendar.WEEK_OF_YEAR, cal.get(Calendar.WEEK_OF_YEAR)); 
//   cal2.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); 

Establece la fecha CAL2 a, por ejemplo, fin de 2009 el 29/12/2010 !!

He utilizado este:

cal2.set(Calendar.DAY_OF_YEAR, cal.get(Calendar.DAY_OF_YEAR)); //to round at the start of day 
cal2.set(Calendar.YEAR, cal.get(Calendar.YEAR)); 
cal2.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); //to round at the start of week 

también me aseguro de que semanas en mis calendarios, no importa lo que la configuración regional que se encuentran, están empezando los lunes:

cal.setFirstDayOfWeek(Calendar.MONDAY); 
cal2.setFirstDayOfWeek(Calendar.MONDAY); 
3

Prueba esto:

public static Calendar setWeekStart(Calendar calendar) { 
    while (calendar.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY) { 
    calendar.add(Calendar.DATE, -1); 
    } 
    setDayStart(calendar); // method which sets H:M:S:ms to 0 
    return calendar; 
} 
+0

Calendar.MONDAY debe cambiarse a calendar.getFirstDayOfWeek() –

+0

Es cierto, lo actualicé – Tarion

1

Otra forma más ...

GregorianCalendar cal = new GregorianCalendar(); 
    cal.clearTime(); 
    Integer correction = 1-cal.get(GregorianCalendar.DAY_OF_WEEK) 
    cal.add(Calendar.DATE, correction); 

cal es ahora el primer día de la semana

1-cal.get(GregorianCalendar.DAY_OF_WEEK)

evalúa a 1-1 para el domingo (primer día de la semana en mi Locale) y 1-2 para el lunes, por lo que este le dará la corrección necesaria para rebobinar el reloj de nuevo a Domingo

0

Pruebe el algoritmo gregoriano Calendario:

public int getFirstDay(int m, int year) 
    { 
     int k=1; 
     int c, y, w, M=0; 
     if(m>2 && m<=12) M=m-2; 
     else if(m>0 && M<=2) 
     { 
      M=m+10; 
      year-=1; 
     } 
     c=year/100; 
     y=year%100; 
     w=(int)((k+(Math.floor(2.6*M - 0.2))-2*c+y+(Math.floor(y/4))+(Math.floor(c/4)))%7);//a fantastic formula   
     if(w<0) w+=7; 
     return w;//thus the day of the week is obtained! 
    } 
Cuestiones relacionadas