web-dev-qa-db-fra.com

Java Calendar.set (Calendar.DAY_OF_WEEK, Calendar.SUNDAY), sera-t-il annulé, connu ou inconnu?

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?

27
Will

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.

12
VoteyDisciple

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);
7
Alexander Smirnov

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!

4
Michael Piefel

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. 

1
Jherico

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.

0
Hrvoje

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;
}
0
Anton