Supposons que le code suivant soit exécuté le 22 août 2009 (un samedi)
Calendar c = Calendar.getInstance();
c.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
c.get(Calendar.DAY_OF_MONTH)
retournera 23. Les conditions m'intéressent (14 dimanche dernier au lieu du dimanche suivant).
Existe-t-il des règles associées à la direction? Le calendrier lancera le DAY_OF_MONTH/YEAR
lorsque DAY_OF_WEEK
sera défini? Si c'est vrai, que sont-ils?
Il devrait toujours conserver le même WEEK_OF_MONTH
( http://Java.Sun.com/j2se/1.4.2/docs/api/Java/util/Calendar.html#WEEK_OF_MONTH ). De la documentation:
Lors du réglage ou de l'obtention du Champs WEEK_OF_MONTH ou WEEK_OF_YEAR, Le calendrier doit déterminer la première semaine du mois ou de l'année comme référence point. La première semaine du mois ou l'année est définie comme étant la première des sept premières jour commençant le getFirstDayOfWeek () et contenant à moins getMinimalDaysInFirstWeek () jours de ce mois ou de cette année. Semaines numérotées ..., -1, 0 avant la première semaine; semaines numérotées 2, 3, ... suivez-le . Notez que la numérotation normalisée retourné par get () peut être différent . Par exemple, un calendrier spécifique la sous-classe peut désigner la semaine précédant semaine 1 de l'année en tant que semaine n du année précédente.
la formule suivante renvoie "jour" le jour de la semaine compris dans l'intervalle [0; 6]
(d + numberOfDaysInAWeek - firstDayOfWeek) % numberOfDaysInAWeek
ou ajoutez 1 si vous voulez la plage [1; 7]
(d + numberOfDaysInAWeek - firstDayOfWeek) % numberOfDaysInAWeek + 1
d
est ce que Calendar.get(Calendar.DAY_OF_WEEK)
renvoie
pour obtenir le premier jour de la semaine, soustrayez le résultat de la formule de la date du jour. Le code suivant le fait:
final int currentDayOfWeek = (calendar.get(Calendar.DAY_OF_WEEK) + 7 - cal.getFirstDayOfWeek()) % 7;
cal.add(Calendar.DAY_OF_YEAR, -currentDayOfWeek);
Cela dépend, en fait. Considérez le code Java suivant. C'est en fait assez simple et j'imagine qu'il devrait imprimer le lundi qui précède le 2011-09-18, soit le 2011-09-12:
Calendar calendar = Calendar.getInstance(Locale.GERMANY);
System.out.printf("First day of week: %d%n%n", calendar.getFirstDayOfWeek());
calendar.set(2011, Calendar.SEPTEMBER, 18);
System.out.printf("Starting day: %tF%n", calendar);
calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
System.out.printf("Last monday: %tF%n%n", calendar);
calendar.set(2011, Calendar.SEPTEMBER, 18);
System.out.printf("Starting day: %tF (week %d)%n",
calendar, calendar.get(Calendar.WEEK_OF_YEAR));
calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
System.out.printf("Last monday: %tF (week %d)%n", calendar,
calendar.get(Calendar.WEEK_OF_YEAR));
Mais en réalité, le résultat est un peu différent:
First day of week: 2
Starting day: 2011-09-18
Last monday: 2011-09-19
Starting day: 2011-09-18 (week 37)
Last monday: 2011-09-12 (week 37)
En d'autres termes, le résultat dépend de si mon calendrier sait que la semaine peut m'intéresser. Le résultat change réellement si je demande WEEK_OF_YEAR
!
Depuis le Javadoc :
En cas de conflit entre les valeurs des champs de calendrier, Calendar attribue des priorités aux champs de calendrier définis récemment. Voici les combinaisons par défaut des champs de calendrier. La combinaison la plus récente, telle que déterminée par le dernier champ unique défini, sera utilisée.
Pour les champs de date:
YEAR + MONTH + DAY_OF_MONTH
YEAR + MONTH + WEEK_OF_MONTH + DAY_OF_WEEK
YEAR + MONTH + DAY_OF_WEEK_IN_MONTH + DAY_OF_WEEK
YEAR + DAY_OF_YEAR
YEAR + DAY_OF_WEEK + WEEK_OF_YEAR
J'interprète cela comme signifiant que, étant donné que vous définissez le jour de la semaine, il sera finalement combiné à la semaine ou au mois de l'année afin de produire la date et l'heure réelles.
Vous devriez également vérifier quel est le premier jour de la semaine . J'ai aussi pensé que c'était toujours le dimanche, mais cela dépend des paramètres locaux, et dans mon cas Le lundi est le premier jour de la semaine. Régler le dimanche comme premier jour de la semaine a réglé mon problème.
Dépend du premier jour de la semaine:
/**
* Gets what the first day of the week is; e.g., <code>SUNDAY</code> in the U.S.,
* <code>MONDAY</code> in France.
*
* @return the first day of the week.
* @see #setFirstDayOfWeek(int)
* @see #getMinimalDaysInFirstWeek()
*/
public int getFirstDayOfWeek()
{
return firstDayOfWeek;
}