98 votes

Le calendrier renvoie un mois erroné

 Calendar rightNow = Calendar.getInstance();
String month = String.valueOf(rightNow.get(Calendar.MONTH));
 

Après l'exécution de l'extrait ci-dessus, le mois prend une valeur de 10 au lieu de 11. Pourquoi?

130voto

Vincent Ramdhanie Points 46265

Les mois sont indexés de 0 à 1, le 10 est donc novembre et le 11 décembre.

28voto

Bozho Points 273663

Ils commencent à 0 - vérifiez la documentation

22voto

Bart Kiers Points 79069

Comme l’indiquent les nombreuses réponses: le mois commence par 0.

Voici un conseil: vous devriez utiliser SimpleDateFormat pour obtenir la représentation sous forme de chaîne du mois:

 Calendar rightNow = Calendar.getInstance();
java.text.SimpleDateFormat df1 = new java.text.SimpleDateFormat("MM");
java.text.SimpleDateFormat df2 = new java.text.SimpleDateFormat("MMM");
java.text.SimpleDateFormat df3 = new java.text.SimpleDateFormat("MMMM");
System.out.println(df1.format(rightNow.getTime()));
System.out.println(df2.format(rightNow.getTime()));
System.out.println(df3.format(rightNow.getTime()));
 

Sortie:

 11
Nov
November
 

Remarque: la sortie peut varier, elle est spécifique à la région.

18voto

Matt Ryall Points 2187

Comme plusieurs personnes l'ont souligné, mois renvoyé par le Calendrier et la Date de classes en Java sont indexés à partir de 0 au lieu de 1. Donc 0 est de janvier et le mois en cours, en novembre, est de 10.

Vous pourriez vous demander pourquoi c'est le cas. Les origines de mensonge avec la norme POSIX fonctions ctime, gmtime et localtime, qui acceptent ou retourner un time_t de la structure avec les champs suivants (de l'homme 3 ctime):

int tm_mday;    /* day of month (1 - 31) */
int tm_mon;     /* month of year (0 - 11) */
int tm_year;    /* year - 1900 */

Cette API a été copié à peu près exactement dans la Java classe Date en Java 1.0, et à partir de là en grande partie intact dans le Calendrier de la classe en Java 1.1. Soleil fixe la plus flagrante problème quand ils ont introduit le Calendrier – le fait que l'année 2001 dans le calendrier Grégorien a été représenté par la valeur 101 dans leur classe Date. Mais je ne suis pas sûr de savoir pourquoi ils n'ont pas changé le jour et le mois de valeurs pour au moins deux d'être cohérent dans leur indexation, soit à partir de zéro ou un. Cette incohérence et de la relative confusion existe encore en Java (et C) à ce jour.

11voto

Federer Points 4799

Les mois commencent à zéro, comme les index des listes.

Donc Jan = 0, Feb = 1, etc.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X