web-dev-qa-db-fra.com

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

Toute suggestion? (travaillant en Java)

20
framara

Ces champs ne renvoient pas les valeurs. Ce sont constants qui identifie les champs de l’objet Calendar que vous pouvez obtenir/set/add. Pour obtenir ce que vous voulez, vous devez d'abord obtenir une 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, apprenez à lire le javadocs pour apprendre à utiliser les classes/méthodes/champs et n'essayez pas de tirer au hasard dans votre IDE;)

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

38
BalusC

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

Je n'ai pas fait beaucoup de choses 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));

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)

2
Morfildur

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

1
chim

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

Soyez prudent avec ceux-ci, calendar.get(Calendar.WEEK_OF_YEAR) renvoie 1 si nous sommes à la fin du mois de décembre et qu’une semaine se termine déjà l’année suivante.

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 sur, par exemple, 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 de mon calendrier, quel que soit l'endroit où elles se trouvent, commencent le lundi:

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

Voici un code rapide et sale pour le faire. Ce code crée un objet 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(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
SOA Nerd