web-dev-qa-db-fra.com

Obtenir les résultats étranges de l'année et du mois en cours

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.

24
Yaqub Ahmad

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:

  • Si votre IDE le permet (comme le fait Eclipse), définissez des expressions telles que c.YEAR pour une erreur de compilation: vous obtiendrez un code beaucoup plus clair si vous utilisez toujours Calendar.YEAR.
  • Dans la mesure du possible, utilisez Joda Time - une meilleure bibliothèque date/heure pour Java. Certes, sur Android, vous êtes peut-être un peu limité en termes d'espace, mais si votre application effectue beaucoup de manipulations de date/heure, cela vous évitera beaucoup de maux de tête.
59
Jon Skeet

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;
21
Bala Vishnu
int year=c.get(Calendar.YEAR);
int month=c.get(Calendar.MONTH);

   System.out.println(year);
   System.out.println(month);
5
Samir Mangroliya

tl; dr

YearMonth.now( 
    ZoneId.of( "America/Montreal" ) 
)

Détails

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.

Évitez les anciennes classes date-heure

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.


À propos de Java.time

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? 

  • Java SE 8 et SE 9 et versions ultérieures
    • Intégré. 
    • Une partie de l'API Java standard avec une implémentation fournie.
    • Java 9 ajoute quelques fonctionnalités et corrections mineures.
  • Java SE 6 et SE 7
    • Une grande partie de la fonctionnalité Java.time est rétroportée vers Java 6 et 7 dans ThreeTen-Backport .
  • Android
3
Basil Bourque
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

2
Shankar Agarwal

Comment obtenir l'année et le mois en cours.

        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.

1
Elenasys