2010-01-12 6 views
4

Soit je ne comprends pas la méthode getActualMaximum(int) ou le champ WEEK_OF_YEAR, ou il y a un bug Sun impliqués (ou tous les trois) ... quelqu'un pourrait-il m'expliquer pourquoi (au moins dans un lieu allemand ...) le code suivant:Calendar.getActualMaximum (Calendar.WEEK_OF_YEAR) bizarrerie

Locale.setDefault(Locale.GERMAN); 
    Calendar c = Calendar.getInstance(); 
    c.set(Calendar.YEAR, 2010); 
    c.set(Calendar.MONTH, 0); 
    c.set(Calendar.DAY_OF_MONTH, 1); 
    System.out.println("max: "+c.getActualMaximum(Calendar.WEEK_OF_YEAR)); 
    System.out.println("actual: "+c.get(Calendar.WEEK_OF_YEAR)); 

produit la sortie suivante:

max: 52 
    actual: 53 

Voici le Javadoc de getActualMaximum(int):

Renvoie la valeur maximale que le champ de calendrier spécifié peut avoir, étant donné la valeur temporelle de ce calendrier. Par exemple, la valeur maximale réelle du champ MOIS est de 12 dans certains ans, et de 13 dans les autres années dans le système de calendrier hébraïque .


Modifier

L'intrigue épaissit. Dans un environnement linguistique anglais (-Duser.language=en -Duser.country=us) la sortie est:

max: 52 
    actual: 1 

semble indiquer qu'il soit un bogue de Sun pour les paramètres régionaux allemands?

+0

jours commencent à 1, mais les mois commencent à zéro? –

+0

euh ouais. Croyez-le ou non. :) – Epaga

Répondre

3

Cette information est correcte:

max: 52 
actual: 53 

L'année 2010 a un maximum de 52 semaines. La semaine actuelle est de 53, puisque 2009 a un maximum de 53 semaines et la plupart des semaines commencent le dimanche ou le lundi. La semaine 1 est dans la plupart des cas la première semaine de l'année avec 4 jours en janvier. Puisque la semaine du 1er janvier n'a que 2 ou 3 jours en 2010, la semaine est considérée comme une partie de 2009.

La région anglaise a probablement des règles différentes pour déterminer la semaine 1, comme la première semaine est la semaine de janvier 1er.

Wikipédia explique correctement: wikipedia week article

+0

Merci ... mais dans la mesure où j'ai lu le Javadoc, il semble que getActualMaximum ne me donne pas le maximum pour l'année, mais plutôt pour la valeur temporelle du calendrier: cela ne devrait pas me donner un réel maximum de 53 pour le 1er janvier? – Epaga

+0

dépend de ce qui est considéré comme l'heure réelle. l'année 2010 a 52 semaines, 2009 a 53 semaines. vous devriez jeter un oeil sur le code source de l'implémentation réelle – Salandur

+0

ouais c'est ce que j'ai fini par faire ... après avoir regardé le code source, j'ai essentiellement trouvé une solution de contournement: pour obtenir le vrai maximum réel de une année, obtenez la semaine du calendrier du 31 décembre. Si c'est 1, alors le maximum réel pour cette année est de 52. Donc, frickin 'compliqué ...;) – Epaga

2

Le problème est que le 1er Janvier 2010 est à la semaine 53 de 2009 (en Allemagne), mais l'année 2010 a seulement 52 semaines (31 Décembre 2010 est la semaine 52). L'objet Java Calendar n'a malheureusement pas de champ pour l'année, à laquelle se rapporte le numéro de semaine.

+0

Mais comment obtenir la bonne année pour cette semaine? – Kdeveloper

Questions connexes