2010-01-21 3 views
20

Laissez-moi m'expliquer. En connaissant le numéro de la semaine et l'année d'une date:Comment obtenir le premier jour d'un numéro de semaine donné en Java

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 regardé dans Calendrier, Date, DateFormat mais rien qui peut être utile ...

Une suggestion? (fonctionnant en Java)

Répondre

38

Ces champs ne renvoient pas les valeurs. Ce sont constantes qui identifie les champs de l'objet Calendar que vous pouvez obtenir/définir/ajouter. Pour atteindre ce que vous voulez, vous devez d'abord obtenir un Calendar, l'effacer et définir les valeurs connues. Il fixera 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 apprendre à lire le javadocs d'apprendre à utiliser des classes/méthodes/champs et ne pas essayer de pousser au hasard dans votre IDE;)

Cela dit, le java.util.Date et java.util.Calendar sont epic failures . Si vous le pouvez, envisagez de passer au Joda Time.

+3

Notez que les numéros de semaine dépendent des paramètres régionaux. Soyez absolument certain que vos paramètres régionaux sont corrects! –

+1

actuellement en utilisant Joda temps, tellement plus facile de travailler avec, je recommanderais de passer à –

+0

Merci, c'est exactement ce dont j'avais besoin. Quoi qu'il en soit, je vais jeter un coup d'œil à Joda Time comme vous l'avez suggéré. Je suis encore au niveau débutant, je dois encore apprendre beaucoup. – framara

2

Je n'ai pas fait des choses beaucoup Date en Java, mais une solution pourrait être:

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

Logic:

Obtenez le jour de la semaine et soustraient à partir de la date actuelle (peut-être besoin - 1, selon que vous avez besoin de lundi pour être le premier jour de la semaine ou le dimanche)

0

Voici un code rapide et sale pour ce faire. Ce code crée un objet calendrier avec la date du jour en cours, calcule le jour actuel de la semaine et soustrait le jour de la semaine pour que vous soyez sur le premier (dimanche). Bien que j'utilise DAY_OF_YEAR, ça va bien pendant des années (le 1/2/10 ça retournera le 27/12/09 ce qui est juste).

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

Soyez prudent avec ceux-ci, calendar.get(Calendar.WEEK_OF_YEAR) renvoie 1 si elle est fin Décembre et déjà une semaine qui se termine l'année prochaine.

En utilisant

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

fixe la date de CAL2 à, par exemple fin de 2009 le 29/12/2010 !!

J'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 me assure aussi que les semaines dans mes calendriers, peu importe ce lieu qu'ils sont, commencent les lundis:

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

Essayez ceci:

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 doit être remplacé par calendar.getFirstDayOfWeek() –

+0

True, mis à jour – Tarion

1

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)

à 1-1 pour évalue dimanche (premier jour de la semaine dans mon Locale) et 1-2 pour lundi, cette vous donnera la correction nécessaire pour revenir en arrière l'horloge à dimanche

0

Essayez l'algorithme de 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! 
    } 
Questions connexes