Comment obtenir le premier jour d’un numéro de semaine donné en Java

Laisse moi m’expliquer. En connaissant le numéro de semaine et l’année d’une date:

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

Mais maintenant, je ne sais pas comment obtenir la date du premier jour de cette semaine. J’ai cherché dans Calendar, Date, DateFormat mais rien de ce qui peut être utile …

Toute suggestion? (travaillant en Java)

Ces champs ne renvoient pas les valeurs. Ce sont des constantes qui identifient les champs de l’object Calendar que vous pouvez obtenir / définir / append. Pour obtenir ce que vous voulez, vous devez d’abord obtenir un Calendar , le supprimer et définir les valeurs connues. Il définira automatiquement la date au premier jour de cette semaine.

 // 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(); 

S’il vous plaît, apprenez à lire les javadocs pour apprendre à utiliser les classes / méthodes / champs et n’essayez pas de tirer au hasard dans votre IDE;)

Cela dit, java.util.Date et java.util.Calendar sont des échecs épiques . Si vous le pouvez, envisagez de passer à Joda Time .

Essaye ça:

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

Je n’ai pas fait beaucoup de choses dans Java mais une solution pourrait être:

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

Logique:

Obtenez le jour de la semaine et soustrayez-le de la date actuelle (peut-être besoin de -1, selon que vous ayez besoin du lundi pour être le premier jour de la semaine ou le dimanche)

Encore une autre façon …

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

cal est maintenant le premier jour de la semaine

1-cal.get(GregorianCalendar.DAY_OF_WEEK)

évalue à 1-1 pour dimanche (premier jour de la semaine dans ma région) et 1-2 pour lundi, donc cela vous donnera la correction nécessaire pour revenir en arrière au dimanche

Soyez prudent avec ceux-ci, calendar.get(Calendar.WEEK_OF_YEAR) renvoie 1 s’il est fin décembre et que la semaine se termine déjà dans l’année à venir.

En utilisant

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

définit la date cal2 à eg fin 2009 le 29/12/2010 !!

J’ai utilisé ceci:

 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 

Je m’assure également que les semaines dans mes calendriers, quelle que soit la localisation dans laquelle elles se trouvent, commencent le lundi:

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

Essayez l’algorithme du calendrier grégorien:

 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! } 

Voici un code rapide et sale pour le faire. Ce code crée un object de calendrier avec la date du jour actuel, calcule le jour actuel de la semaine et soustrait le jour de la semaine pour que vous soyez le premier (dimanche). Bien que j’utilise DAY_OF_YEAR, les années sont bonnes (le 1/2/10, le 12/27/09 est correct).

 import java.text.Format; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; public class DOW { public static void main(Ssortingng[] 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())); } }