J'ai une fonction qui reçoit en entrée une string (un type de période: mois, semaine ou personnalisée) et une date, et qui, dans le cas hebdo ou mensuel, retourne le lundi le plus proche de la date d'entrée.

La fonction donne le résultat attendu, mais à une seule condition : que chaque manipulation du calendrier (add ou set) soit suivie par un appel à Calendar.getTime(). Sans ces appels, le résultat est invariablement le même : la date d'entrée.

Voici le code correspondant :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
 
public static String getDateAvantPeriode(String type_periode, String dateDebut)  {
		Date date_base = null;
		String retour=null;
		Calendar c = Calendar.getInstance();
		SimpleDateFormat sdf=new SimpleDateFormat("dd/MM/yyyy");		
		try {
			date_base = Outils.convertStringToDate(dateDebut,Outils.DATE_FORMAT);
 
			//retour au lundi de la semaine
			if(type_periode.equals("hebdo")) {
 
				c.setTime(date_base);//RAZ
				c.set(Calendar.DAY_OF_WEEK, 2); 
				Date date_hebdo = c.getTime();
				retour=Outils.convertDateToString(date_hebdo, Outils.DATE_FORMAT);
			}
			//retour au 1er lundi du mois
			else if(type_periode.equals("mois")) {
 
				c.setTime(date_base);//RAZ
				int month_original=c.get(Calendar.MONTH);
				c.set(Calendar.DAY_OF_MONTH, 1);
				c.getTime();
 
				c.set(Calendar.DAY_OF_WEEK, 2);
				c.getTime();
 
				int month_after=c.get(Calendar.MONTH);
 
				if(month_original!=month_after) {
					c.add(Calendar.WEEK_OF_YEAR, 1);
					c.getTime();
				}
 
				Date date_mois = c.getTime();
 
				retour=Outils.convertDateToString(date_mois, Outils.DATE_FORMAT);
			}
			else /*if(type_periode.equals("autre"))*/ {
				date_base = sdf.parse(dateDebut);
 
				retour=Outils.convertDateToString(date_base, Outils.DATE_FORMAT);
			}
		}
		catch (ParseException pe) {
			pe.printStackTrace();
		}
 
		return retour;
	}
Si vous y comprenez qqch, je veux bien l'explication...

Merci d'avance.