2017-08-04 5 views
0

Je souhaite obtenir le jour ISO de la semaine à l'aide de l'API Calendar, mais il renvoie le mauvais jour.Comment obtenir le jour de la semaine ISO à l'aide de l'API Calendar

dimanche est le dernier jour de la semaine et devrait être le numéro 7 de la norme ISO, avec lundi le premier jour que le numéro 1.

Mais l'exécution du code ci-dessous pour un dimanche (2017-07 -30) me renvoie le numéro . Pourquoi l'API Calendar me renvoie-t-elle une valeur différente?

Calendar cal = Calendar.getInstance(Locale.US); 
cal.set(Calendar.YEAR, 2017); 
cal.set(Calendar.MONTH, Calendar.JULY); 
cal.set(Calendar.DAY_OF_MONTH, 30); 
cal.set(Calendar.HOUR_OF_DAY, 0); 
cal.set(Calendar.MINUTE, 0); 
cal.set(Calendar.SECOND, 0); 
cal.set(Calendar.MILLISECOND, 0); 
int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK); 

System.out.println(dayOfWeek); 

Le résultat est le suivant: 1

J'ai essayé avec Joda Time et il a bien fonctionné, mais je dois le faire en utilisant le calendrier et Java 6, donc en utilisant une autre bibliothèque est pas une solution.

Répondre

1

Les constantes int commencent par dimanche et se terminent par samedi.

Documenté en java.util.Calendar JavaDoc for Java 6. Donc, ma proposition est de le calculer par vous-même.

+0

Bien sûr, vous avez raison. Pas d'énumération, constantes. J'ai changé la réponse selon ceci. – Maia

0

Vérifiez la Javadoc du calendrier pour Java 6 avant de poster une question values of Constants in Calendar

La valeur de Calendar.SUNDAY est 1 pour US Locale.

+0

La valeur de Calendar.SUNDAY est toujours la même, elle ne change pas en fonction des paramètres régionaux. –

+0

Calendar.sunday n'est pas modifié par les paramètres régionaux mais le jour de la semaine, car 1 change en fonction des paramètres régionaux. Mes excuses pour une réponse vague mais mon intention est différente –

1

tl; dr

Héritage façon de déterminer le jour de la semaine numéro défini ISO 8601 (lundi au dimanche 1-7):

int dayOfWeekISO = cal.get(Calendar.DAY_OF_WEEK) - 1 ; 
if(dayOfWeekISO == 0) { // For Sunday (1 - 1 = 0), add 7. 
    dayOfWeekISO = (dayOfWeekISO + 1) ; 
} 

façon moderne:

LocalDate.of(2017 , Month.JULY , 30) // Date-only value. 
     .getDayOfWeek()    // `DayOfWeek.SUNDAY` enum object. 
     .getValue()     // 7 for Sunday. (1 = Monday, per ISO 8601 standard.) 

Détails

Le accepted answer by Maia est correct: Those int constants on Calendar définir la semaine comme 1-7 pour Sunday -Saturday, selon la coutume aux États-Unis.

DAY_OF_WEEK

public static final int DAY_OF_WEEK

numéro de champ pour obtenir et définir indiquant le jour de la semaine. Ce champ prend des valeurs dimanche, lundi, mardi, mercredi, jeudi, vendredi et samedi.

Si vous ne pouvez absolument pas ajouter une bibliothèque, vous devez régler de la définition Calendar d'une semaine étant dimanche samedi 1-7. Pour mettre de l'argent en premier lieu, soustrayez 1, puis vérifiez 0 auquel vous ajoutez 7.

int dayOfWeekISO = cal.get(Calendar.DAY_OF_WEEK) - 1 ; 
if(dayOfWeekISO == 0) { // For Sunday (1 - 1 = 0), add 7. 
    dayOfWeekISO = (dayOfWeekISO + 1) ; 
} 

Par la voie à suivre dans l'autre sens, de ISO 8601 style à l'américaine (premier dimanche), calculer modulo 7 puis, plus 1.

(DayOfWeek.SUNDAY.getValue() % 7) + 1 

Comme ceci:

System.out.println((DayOfWeek.SUNDAY.getValue() % 7) + 1) ; 
System.out.println((DayOfWeek.MONDAY.getValue() % 7) + 1) ; 
System.out.println((DayOfWeek.TUESDAY.getValue() % 7) + 1) ; 
System.out.println((DayOfWeek.WEDNESDAY.getValue() % 7) + 1) ; 
System.out.println((DayOfWeek.THURSDAY.getValue() % 7) + 1) ; 
System.out.println((DayOfWeek.FRIDAY.getValue() % 7) + 1) ; 
System.out.println((DayOfWeek.SATURDAY.getValue() % 7) + 1) ; 

Mais ne pensez à ajouter a library of modern date-time classes. Cela vaut la peine d'ajouter un pot à votre projet. Ces vieilles classes de date-heure sont vraiment misérables.

Évitez les classes date temps anciens

La classe

Calendar est une partie des classes date de temps, gênants héritage vieux maintenant supplanté par les classes de java.time.

java.time

Le java.time.DayOfWeek ENUM est standard, ce qui représente une semaine définie par ISO 8601 où une semaine se déroulera du lundi au dimanche, numérotées 1-7.

La classe LocalDate représente une valeur de date uniquement sans heure et sans fuseau horaire.

LocalDate ld = LocalDate.of(2017 , Month.JULY , 30) ; 
DayOfWeek dow = ld.getDayOfWeek() ; 
int dowNumber = dow.getValue() ; 
String output = dow.getDisplayName(TextStyle.FULL , Locale.CANADA_FRENCH) ; 

Voir this code run live at IdeOne.com.

ld.toString(): 30.07.2017

dow.toString(): dimanche

dowNumber: 7

sortie: dimanche


A propos de java.time

Le framework java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent les vieilles classes de date-heure legacy gênantes telles que java.util.Date, Calendar, & SimpleDateFormat. Le projet Joda-Time, maintenant en maintenance mode, conseille la migration vers les classes java.time.

Pour en savoir plus, voir le Oracle Tutorial. Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 310.

Où obtenir les classes java.time?

  • Java SE 8, Java SE 9, et plus tard
    • intégré.
    • Partie de l'API Java standard avec une implémentation groupée.
    • Java 9 ajoute quelques fonctionnalités et corrections mineures.
  • Java SE 6 et Java SE 7
    • Une grande partie de la fonctionnalité de java.time est de retour à Java 6 Ported .
  • Android

Le projet ThreeTen-Extra java.time étend avec des classes supplémentaires. Ce projet est un terrain d'essai pour d'éventuels ajouts futurs à java.time. Vous pouvez trouver ici des classes utiles telles que Interval, YearWeek, YearQuarter et more.