BigDate probleme mauvaise semaine

Le
pcouas
Bonjour

J'utilise la classe BigDate http://mindprod.compour la gestion d'un
calendrier, notament pour obtenir la premiere semaine d'un mois.
J'ai un comportement bizarre sur la premiere semaine de l'anne 2006,
la classe me trouve la semaine 200552, au lieu de 200601 ?

Ou est mon erreur ?
Cordialement
Philippe





/***
*
* FOR FRENCH CALENDAR
*
* @mindprod.com
* roedy@telus.net
* roedy@mindprod.com
*/
public class Class1 {
public Class1() {
}

public static void main(String[] args) {
Class1 class1 = new Class1();
String dbper=new String("200601");

System.out.println("getFirstWeekFromMonth01 "+dbper);
String tempd=new String("");
if(dbper!=null && dbper.length()==6)
{
int year=Integer.parseInt(dbper.substring(0,4)); // Annee
int month=Integer.parseInt(dbper.substring(4,6));
BigDate d = new BigDate(year,month,1);
System.out.println("getFirstWeekFromMonth02
"+d.getISOWeekNumber()); //First Week in January is 01 and not 52 ???
}
}

}
Vos réponses
Trier par : date / pertinence
pcouas
Le #223883
je crois que j'ai trouve c'est "+d.getWeekNumber(); a utiliser au lieu
de d.getISOWeekNumber();



Bonjour

J'utilise la classe BigDate http://mindprod.compour la gestion d'un
calendrier, notament pour obtenir la premiere semaine d'un mois.
J'ai un comportement bizarre sur la premiere semaine de l'année 2006,
la classe me trouve la semaine 200552, au lieu de 200601 ?

Ou est mon erreur ?
Cordialement
Philippe





/***
*
* FOR FRENCH CALENDAR
*
* @mindprod.com
*
*
*/
public class Class1 {
public Class1() {
}

public static void main(String[] args) {
Class1 class1 = new Class1();
String dbper=new String("200601");

System.out.println("getFirstWeekFromMonth01 "+dbper);
String tempd=new String("");
if(dbper!=null && dbper.length()==6)
{
int year=Integer.parseInt(dbper.substring(0,4)); // Annee
int month=Integer.parseInt(dbper.substring(4,6));
BigDate d = new BigDate(year,month,1);
System.out.println("getFirstWeekFromMonth02
"+d.getISOWeekNumber()); //First Week in January is 01 and not 52 ???
}
}

}


TestMan
Le #223882
Bonjour

J'utilise la classe BigDate http://mindprod.compour la gestion d'un
calendrier, notament pour obtenir la premiere semaine d'un mois.
J'ai un comportement bizarre sur la premiere semaine de l'année 2006,
la classe me trouve la semaine 200552, au lieu de 200601 ?

Ou est mon erreur ?
Cordialement
Philippe


Pas d'erreur, même le code utilisant directement le Calendar :

public static void main(String[] args) throws ParseException {
Calendar cal = Calendar.getInstance(Locale.FRANCE);
SimpleDateFormat format = new SimpleDateFormat("yyyyMM");
Date period = format.parse("200601");
cal.setTime(period);
System.out.println("Semaine:"+cal.get(Calendar.WEEK_OF_YEAR));
}

Retourne aussi 52 en Locale FRANCE, mais si tu passes en Locale.US tu
obtiendras 1 !

La raison est qu'en France le premier jour de la semaine est un Lundi
(contrairement aux US ou c'est le dimanche).

Or le premier jour de 2006 est un dimanche, et la semaine correspondante
à ce dimanche à débutéele 26 décembre 2005 qui est bien la 52e semaine
de son année.

Surprenant, mais exact si l'on en croit le test sur :
http://personal.ecu.edu/mccartyr/isowdcal.html

A+
TM

pcouas
Le #223869
Ok,

et pour mon appli qui doit etre internationale, et donc avec des
seveurs Francais et etranger, quel est le mieux
LOCALE.US tout le temps ?
LOCALE.FRANCE et cal3.setMinimalDaysInFirstWeek(4); // Le Jeudi
Ou il y a t il une autre solution ?

Cordialement
Philippe
TestMan
Le #223866
Ok,

et pour mon appli qui doit etre internationale, et donc avec des
seveurs Francais et etranger, quel est le mieux
LOCALE.US tout le temps ?
LOCALE.FRANCE et cal3.setMinimalDaysInFirstWeek(4); // Le Jeudi
Ou il y a t il une autre solution ?

Cordialement
Philippe



Pour une appli client :

Calendar.getInstance()

Pour une appli serveur :

Calendar.getInstance(request.getLocale())

Comme celà, le calendrier sera calquée sur les habitude du client et les
comportements ISO ...

Si tu veut ensuite trouver "le premier jour de la semaine du mois
courrant" en plus du code donné il te faudra ajouté :

cal.set(Calendar.WEEK_OF_MONTH,1);
cal.set(Calendar.DAY_OF_WEEK,cal.getFirstDayOfWeek());

Qui pour janvier 2006 est le 1 janvier aux US mais le 2 janvier en
France ...

A+
TM

pcouas
Le #223865
Par contre sur un serveur Francais c'est problematique


Calendar cal3 = new GregorianCalendar(Locale.FRANCE);
week2;
cal3 = Calendar.getInstance(Locale.FRANCE);
cal3.setMinimalDaysInFirstWeek(4); // Le Jeudi 4,3
cal3.set(cal3.YEAR,2006); // Annee
cal3.set(cal3.WEEK_OF_YEAR,week2) ;

System.out.println("Semaine:"+cal3.get(Calendar.WEEK_OF_YEAR));
System.out.println("Date "+cal3.get(Calendar.DATE));

Si je met la ligne cal3.setMinimalDaysInFirstWeek(4); // Le Jeudi 4,3
j'ai bien le 26 Janvier, si je ne la positionne pas j'ai le 19 Janvier
TestMan
Le #223863
Par contre sur un serveur Francais c'est problematique


Calendar cal3 = new GregorianCalendar(Locale.FRANCE);
week2;
cal3 = Calendar.getInstance(Locale.FRANCE);
cal3.setMinimalDaysInFirstWeek(4); // Le Jeudi 4,3
cal3.set(cal3.YEAR,2006); // Annee
cal3.set(cal3.WEEK_OF_YEAR,week2) ;

System.out.println("Semaine:"+cal3.get(Calendar.WEEK_OF_YEAR));
System.out.println("Date "+cal3.get(Calendar.DATE));

Si je met la ligne cal3.setMinimalDaysInFirstWeek(4); // Le Jeudi 4,3
j'ai bien le 26 Janvier, si je ne la positionne pas j'ai le 19 Janvier

Bonsoir,


Vérifiéz que vous avez bien une version qui a corrigé :
http://bugs.sun.com/bugdatabase/view_bug.do?bug_idI60215
La 1.5.0 ou 1.6.1rc l'ont de corrigé ....

Si vous voulez le "premier jour" de la "premiere semaine" tel que
définit par le système il faut coder :

Date getFirstDayFromFirstWeekOf(Date period, Locale locale){
final Calendar cal = Calendar.getInstance(locale);
cal.setTime(period);
cal.set(Calendar.WEEK_OF_MONTH,1);
cal.set(Calendar.DAY_OF_WEEK,cal.getFirstDayOfWeek());
return cal.getTime();
}

Celà marche et te retournera ce qui est conforme à la norme ISO 8601.

Si vous voulez le "premier jour" de la "premiere semaine qui a 7 jours
dans le même mois" tu peux coder :

Date getFirstDayFromFirstWeekOf(Date period, Locale locale){
final Calendar cal = Calendar.getInstance(locale);
cal.setMinimalDaysInFirstWeek(7);
cal.setTime(period);
cal.set(Calendar.WEEK_OF_MONTH,1);
cal.set(Calendar.DAY_OF_WEEK,cal.getFirstDayOfWeek());
return cal.getTime();
}

Celà s'adaptera automatiquement aux réglements du pays en vigueur ...
Par exemple le fait que getMinimalDaysInFirstWeek() soit de 4 pour la
FRANCE et 1 pour les US

Un peu de lecture :
http://www.techno-science.net/index.php?onglet=glossaire&definition075

Qqn aurait vu un Calendar "calendrier révolutionaire" qqe part ?

On peu espérer qu'avec la mise sous GPL, des projets type
http://icu.sourceforge.net/apiref/icu4j/ choisissent d'intégrer leur
code dans le RI ...

A+
TM

pcouas
Le #223861
Aie ! sur les Linux c'est une 1.4.2, et sur les serveur AIX4.3.3 c'est
du JDK 1.3.1

Merci pour l'info
TestMan
Le #223839
Aie ! sur les Linux c'est une 1.4.2, et sur les serveur AIX4.3.3 c'est
du JDK 1.3.1

Merci pour l'info



Aie ... AIX, condoléance :( et en 1.3.1 :((
Un JDK1.5 lui ferait du bien car la fin du support par IBM du 1.3.1 est
annoncée pour le 30/09/2007 ! Attention à pas vous trouvé bloqué ...

Coté tux, franchement du 1.4.2 alors que le 1.6 va sortir ! Vous
exagérez ;-) Il est vraiment temps que vous planifiez les mise à jour
les tux.

Je sais bien que les admin n'aime pas les mise à jour : "tant que ça
marche". Surtout quand ce sont des OS payants :(

Bon code à toi...
A+
TM

Publicité
Poster une réponse
Anonyme