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 :
Si vous y comprenez qqch, je veux bien l'explication...
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; }
Merci d'avance.
Partager