Je travaille sur un projet d'apprentissage lié à Android. J'essaie d'obtenir l'année et le mois en cours en utilisant le code ci-dessous, mais cela ne fonctionne pas pour moi.
GregorianCalendar gc = new GregorianCalendar();
gc.YEAR // returning 1
gc.MONTH // returning 2
Calendar c = Calendar.getInstance();
c.YEAR // returning 1
c.MONTH // returning 2
Est-ce que quelqu'un peut m'aider? Est-ce que je fais quelque chose de mal? pardonnez-moi, je suis nouveau dans le développement Java. Merci.
Juste pour donner un peu plus de contexte:
new GregorianCalendar()
et Calendar.getInstance()
donneront correctement un calendrier initialisé à la date et à l'heure actuelles.
MONTH
et YEAR
sont constantes dans la classe Calendar
. Vous devriez pas les utiliser "via" une référence qui donne l’impression qu’ils font partie de l’état d’un objet. La conception de la classe Calendar
regrette malheureusement de devoir appeler get
avec un numéro de champ, spécifié comme l'une de ces constantes, comme indiqué dans d'autres réponses:
Calendar c = Calendar.getInstance();
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH);
Notez que les numéros de mois sont basés sur 0, donc au moment d'écrire ces lignes (en avril), le nombre de mois sera 3.
C'est une partie malheureuse de la conception du langage Java que can référence des membres statiques (tels que des constantes) via des expressions de ce type, plutôt que only via le nom du type.
Mes recommandations:
c.YEAR
pour une erreur de compilation: vous obtiendrez un code beaucoup plus clair si vous utilisez toujours Calendar.YEAR
.Notez que MOIS commence à 0..Alors si vous avez besoin de le mapper à des problèmes pratiques, ajoutez simplement +1
int month=c.get(Calendar.MONTH)+1;
int year=c.get(Calendar.YEAR);
int month=c.get(Calendar.MONTH);
System.out.println(year);
System.out.println(month);
YearMonth.now(
ZoneId.of( "America/Montreal" )
)
Le réponse de Jon Skeet est correct. Vous accédiez aux constantes plutôt que d'interroger votre propre objet.
Voici une alternative totalement différente, utilisant des classes de date-heure modernes.
Les anciennes classes date-heure telles que Java.util.Date
, Java.util.Calendar
et Java.text.SimpleTextFormat
sont maintenant héritées , supplantées par les classes Java.time .
YearMonth
Si vous vous concentrez sur l'année et le mois sans date, sans heure et sans fuseau horaire, utilisez la classe YearMonth
.
Plutôt que de faire passer de simples nombres entiers pour l'année et le mois, faites-le passer par les objets de cette classe. Cela fournit une sécurité de type, garantit des valeurs valides et rend votre code plus auto-documenté.
Déterminer l'année et le mois en cours signifie déterminer la date du jour. Et pour cela, un fuseau horaire est crucial. Pour un moment donné, la date varie dans le monde entier par zone.
ZoneId z = ZoneId.of( "America/Montreal" );
YearMonth ym = YearMonth.now( z );
Vous pouvez interroger pour ses parties.
int year = ym.getYear();
int month = ym.getMonthValue();
Ce cours propose des méthodes pratiques, telles que le fait de savoir s'il s'agit d'une année bissextile. Vous pouvez faire des calculs, comme ajouter/soustraire des mois/années. Vous pouvez obtenir une date pour n'importe quel jour de cette année-mois. Et plus.
Month
Plutôt que de jouer avec un simple entier pour un mois, je vous suggère d'utiliser l'en-tête Month
. Cette classe a une douzaine d'instances prédéfinies, une pour chaque mois de l'année. Comme mentionné ci-dessus, l'utilisation des objets vous fournit une sécurité de type, des valeurs valides et un code auto-documenté.
Month m = ym.getMonth();
La classe dispose de méthodes utiles, telles que la génération d’une chaîne localisée avec le nom du mois.
Le cadre Java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent les anciennes classes gênantes héritées _ date-heure telles que Java.util.Date
, Calendar
_, & SimpleDateFormat
.
Le projet Joda-Time , désormais en mode maintenance , conseille de migrer vers les classes Java.time .
Pour en savoir plus, consultez le Tutoriel Oracle . Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 310 .
Où obtenir les classes Java.time?
Calendar c= Calendar.getInstance()
int cyear = c.get(Calendar.YEAR);//calender year starts from 1900 so you must add 1900 to the value recevie.i.e., 1990+112 = 2012
int cmonth = c.get(Calendar.MONTH);//this is april so you will receive 3 instead of 4.
int cday = c.get(Calendar.DAY_OF_MONTH);
référez-vous ce LIEN
Calendar calendar = Calendar.getInstance();
int month = calendar.get(Calendar.MONTH) + 1;
int year = calendar.get(Calendar.YEAR);
Il est très important d’ajouter 1 pour obtenir le mois correct, car la valeur du premier mois est 0:
int month = calendar.get(Calendar.MONTH) + 1;
MOIS : Numéro de champ pour get et set indiquant le mois. C'est une valeur spécifique au calendrier. Le premier mois de l’année dans les calendriers grégorien et julien est JANVIER, qui est 0; le dernier dépend du nombre de mois dans une année.