2008-09-25 8 views
205

J'ai besoin de déterminer l'année en cours en Java sous la forme d'un nombre entier. Je pourrais juste utiliser java.util.Date(), mais il est obsolète.Obtenir la valeur entière de l'année en cours en Java

+2

Non, 'java.util.Date' n'est pas obsolète, pas à partir de Java 8. Certaines de ses méthodes sont obsolètes mais pas la classe entière. Mais vous devriez éviter 'java.util.Date' et' java.util.Calendar' car ils sont notoirement gênants, confus et défectueux. Au lieu de cela, utilisez [java.time] (http://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html) (en Java 8) ou [Joda-Time] (http : //www.joda.org/joda-time/). –

Répondre

480
int year = Calendar.getInstance().get(Calendar.YEAR); 

Vous ne savez pas si cela répond aux critères de non-installation d'un nouveau calendrier? (Pourquoi l'opposition à le faire?)

+0

En voyant votre réponse, le calendrier serait un bon objet à utiliser. Je cherchais un one-liner et je ne pensais pas que Calendar aurait ça pour moi. Je me suis trompé! Merci! – karlgrz

+0

Qu'en est-il de la concurrence, que se passe-t-il si d'autres threads/morceaux de code de bibliothèque changent l'heure actuelle? Ne serait-il pas raisonnable de le modifier à quelque chose comme: Calendrier c = Calendar.getInstance(); synchronized (c) {c.setTimeInMillis (System.currentTimeMillis()); return c.get (Calendar.YEAR);} – ycnix

+0

Cela renvoie une valeur différente dans différentes versions d'Android. Je compare Android v4.1.2 avec v4.2.1. – toobsco42

12

Le moyen le plus simple est d'obtenir l'année à partir du calendrier.

// year is stored as a static member 
int year = Calendar.getInstance().get(Calendar.YEAR); 
+0

Calendar.YEAR n'est pas l'année en cours. – toolkit

+0

Calendar.YEAR est défini ainsi ... public final static int YEAR = 1; – cagcowboy

+2

L'API get() sur le calendrier obtient la référence située dans le champ spécifié par la constante. L'année est située dans le champ 1 de l'objet Calendrier! Calendar.getInstance() obtient la date actuelle. http://java.sun.com/j2se/1.4.2/docs/api/java/util/Calendar.html#get(int) –

24

Ce simple (en utilisant le calendrier, désolé) est:

int year = Calendar.getInstance().get(Calendar.YEAR); 

Il y a aussi la nouvelle Date and Time API JSR, ainsi que Joda Time

+0

Cela renvoie une valeur différente dans différentes versions d'Android. Je compare Android v4.1.2 avec v4.2.1. – toobsco42

+0

@ toobsco42 - essayez de googler pour 'bug calendar.year android' – toolkit

+0

Hey @toolkit, j'ai fait des recherches sans succès. J'espérais une réponse plus spécifique. – toobsco42

4

Si votre application fait un usage intensif de la date et de calendrier objets, vous devriez vraiment utiliser Joda Time, car java.util.Date est mutable. java.util.Calendar a des problèmes de performance lorsque ses champs sont mis à jour, et est maladroit pour l'arithmétique datetime.

-4

J'utilise des fonctions spéciales dans ma bibliothèque pour travailler avec jours/mois/année ints -

int[] int_dmy(long timestamp) // remember month is [0..11] !!! 
{ 
    Calendar cal = new GregorianCalendar(); cal.setTimeInMillis(timestamp); 
    return new int[] { 
    cal.get(Calendar.DATE), cal.get(Calendar.MONTH), cal.get(Calendar.YEAR) 
    }; 
}; 


int[] int_dmy(Date d) { 
... 
} 
-3

Vous pouvez faire tout cela en utilisant les mathématiques entier sans avoir à instancier un calendrier:

return (System.currentTimeMillis()/1000/3600/24/365.25 +1970); 

Peut être fermé pendant une heure ou deux à la nouvelle année mais je n'ai pas l'impression que c'est un problème?

+4

Espérons que vous ne toucherez jamais le code des alarmes. – berezovskyi

+7

travaillez-vous pour apple, peut-être? http://www.macworld.com/article/2023580/ios-do-not-disturb-feature-oversleeps-on-new-year-s-day.html –

+0

wow, c'est très lourd, je suggère de garder c'est simple comme cagcowboy l'a montré. – LStrike

10

Si vous voulez que l'année de tout objet de ce jour, j'ai utilisé la méthode suivante:

public static int getYearFromDate(Date date) { 
    int result = -1; 
    if (date != null) { 
     Calendar cal = Calendar.getInstance(); 
     cal.setTime(date); 
     result = cal.get(Calendar.YEAR); 
    } 
    return result; 
} 
3

Comme certaines personnes ont répondu ci-dessus:

Si vous souhaitez utiliser plus tard la variable, une meilleure utilisation:

int year; 

year = Calendar.getInstance().get(Calendar.YEAR); 

Si vous avez besoin de l'année pour seulement une condition que vous mieux utiliser:

Calendar.getInstance().get(Calendar.YEAR) 

Par exemple l'utiliser dans un do tout que les contrôles introduits année est au moins l'année 200 en cours ou plus l'année en cours (Peut-être l'année de naissance):

import java.util.Calendar; 
import java.util.Scanner; 

public static void main (String[] args){ 

    Scanner scannernumber = new Scanner(System.in); 
    int year; 

    /*Checks that the year is not higher than the current year, and not less than the current year - 200 years.*/ 

    do{ 
     System.out.print("Year (Between "+((Calendar.getInstance().get(Calendar.YEAR))-200)+" and "+Calendar.getInstance().get(Calendar.YEAR)+") : "); 
     year = scannernumber.nextInt(); 
    }while(year < ((Calendar.getInstance().get(Calendar.YEAR))-200) || year > Calendar.getInstance().get(Calendar.YEAR)); 
} 
2

Vous pouvez également utiliser Java 8 de LocalDate:

import java.time.LocalDate; 
//... 
int year = LocalDate.now().getYear(); 
+1

Note: cela ne fonctionne que sur Java 8 –

+0

@ AndrewT., Obtenez [le BackTour ThreeTen] (http://www.threeten.org/threetenbp/) et cela fonctionnera aussi en Java 6 et 7. –

6

tl; dr

ZonedDateTime.now( ZoneId.of("Africa/Casablanca") ) 
      .getYear() 
Time Zone

The answer par Raffi Khatchadourian montre sagement comment utiliser le nouveau java.time package dans Java 8. Mais cette réponse ne parvient pas à résoudre le problème critique de fuseau horaire dans la détermination d'une date.

int année = date locale.maintenant(). getYear();

Ce code dépend du fuseau horaire par défaut actuel de la JVM. La zone par défaut est utilisée pour déterminer la date d'aujourd'hui. Souvenez-vous, par exemple, qu'à minuit passé à Paris, la date à Montréal est encore «hier». Par conséquent, vos résultats peuvent varier en fonction de la machine sur laquelle il s'exécute, d'un utilisateur/administrateur modifiant le fuseau horaire du système hôte ou de tout code Java à tout moment modifiant la valeur par défaut actuelle de la JVM. Mieux vaut spécifier le fuseau horaire. Par ailleurs, utilisez toujours proper time zone names. N'utilisez jamais les codes à 3 ou 4 lettres qui ne sont ni standardisés ni uniques.

java.time

Exemple dans java.time de Java 8.

int year = ZonedDateTime.now( ZoneId.of("Africa/Casablanca") ).getYear() ; 

Joda-Time

Une idée comme ci-dessus, mais en utilisant la bibliothèque Joda-Time 2.7.

int year = DateTime.now(DateTimeZone.forID("Africa/Casablanca")).getYear() ; 

incrémention/décrémentation Année

Si votre but est de sauter une année à la fois, pas besoin d'extraire le numéro de l'année. Joda-Time et java.time ont toutes deux des méthodes pour ajouter/soustraire une année à la fois. Et ces méthodes sont intelligentes, la gestion de l'heure d'été et d'autres anomalies.

Exemple dans Joda-Time 2.7.

DateTime oneYearAgo = DateTime.now(DateTimeZone.forID("Africa/Casablanca")).minusYears(1) ; 
+0

Tous les ID de zone pour les paresseux (comme moi): https://www.mkyong.com/java8/java-display-all-zoneid-and-its-utc-offset/ – FBB

62

En utilisant l'API de temps de Java 8 (en supposant que vous êtes heureux d'avoir l'année dans le temps par défaut de votre système de zone), vous pouvez utiliser the Year::now method:

int year = Year.now().getValue(); 
+1

Je suggère toujours de passer le 'ZoneId facultatif 'argument à' now' plutôt que de s'appuyer implicitement sur la zone par défaut actuelle de la JVM (qui peut changer à tout moment pendant l'exécution!). –

-1

Voilà comment j'utilisé, simple et le plus facile

Integer currentYear = gregorianDate.getYear(); 
Integer comeupYear = currentYear+1; 
Integer previousYear = currentYear-1; 
1

Vous pouvez également utiliser 2 méthodes de java.time.YearMonth (depuis Java 8):

import java.time.YearMonth; 
... 
int year = YearMonth.now().getYear(); 
int month = YearMonth.now().getMonthValue(); 
+0

Vous dupliquez incorrectement [une autre réponse] (https://stackoverflow.com/a/33700141/642706) posté depuis longtemps. Et vous produisez un mois sans rapport avec la question. Et vous ignorez la question cruciale du fuseau horaire. Et votre formatage est désordonné. Je suis content de vous voir participer à Stack Overflow. Mais cette réponse n'est pas assez bonne. Modifier pour corriger ses faiblesses et ajouter plus de valeur au-delà de ce qui est déjà fourni par les autres réponses. Ou supprimez votre réponse avant qu'elle ne recueille des votes négatifs. P.S. Icône de super avatar! –

+0

Merci beaucoup l'homme. J'ai édité. le lien est un peu différent que mon chemin –

Questions connexes