web-dev-qa-db-fra.com

java.util.Date et getYear ()

Je rencontre le problème suivant en Java (certaines personnes rencontrent un problème similaire en JavaScript mais j’utilise Java)

System.out.println(new Date().getYear());
System.out.println(new GregorianCalendar().getTime().getYear());
System.out.println(this.sale.getSaleDate().getYear());
System.out.println(this.sale.getSaleDate().getMonth());
System.out.println(this.sale.getSaleDate().getDate());

résultats

I/System.out( 4274): 112
I/System.out( 4274): 112
I/System.out( 4274): 112
I/System.out( 4274): 1
I/System.out( 4274): 11

Je ne comprends pas le bit 112 qui, je pensais, aurait été en 2012 . La classe Java.util.Date est-elle inutilisable? Je stocke cela comme champ dans plusieurs De mes classes pour stocker une date et une heure. Que devrais-je faire?

45
johngoche9999

Selon les javadocs:

@Deprecated
public int getYear()

Obsolète. À partir de la version 1.1 du JDK, remplacé par Calendar.get(Calendar.YEAR) - 1900.

Retourne une valeur résultant de la soustraction de 1900 de l'année qui contient ou commence par l'instant présent représenté par cet objet Date, tel qu'interprété dans le fuseau horaire local.

Renvoie: L'année représentée par cette date, moins 1900.

Voir aussi:Calendrier

Donc, 112 est la sortie correcte. Je suivrais les conseils de la Javadoc ou utiliserais plutôt JodaTime.

51
Peter Liljenberg

En plus de tous les commentaires, je pensais pouvoir ajouter du code sur l'utilisation de Java.util.Date, Java.util.Calendar et Java.util.GregorianCalendar conformément au javadoc .

//Initialize your Date however you like it.
Date date = new Date();
Calendar calendar = new GregorianCalendar();
calendar.setTime(date);
int year = calendar.get(Calendar.YEAR);
//Add one to month {0 - 11}
int month = calendar.get(Calendar.MONTH) + 1;
int day = calendar.get(Calendar.DAY_OF_MONTH);
54
fasholaide

Utiliser le format de date

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = format.parse(datetime);
SimpleDateFormat df = new SimpleDateFormat("yyyy");
year = df.format(date);
31
Mosiur

N'utilisez pas Date, utilisez Calendar:

// Beware: months are zero-based and no out of range errors are reported
Calendar date = new GregorianCalendar(2012, 9, 5);
int year = date.get(Calendar.YEAR);  // 2012
int month = date.get(Calendar.MONTH);  // 9 - October!!!
int day = date.get(Calendar.DAY_OF_MONTH);  // 5

Cela prend aussi du temps:

Calendar dateTime = new GregorianCalendar(2012, 3, 4, 15, 16, 17);
int hour = dateTime.get(Calendar.HOUR_OF_DAY);  // 15
int minute = dateTime.get(Calendar.MINUTE);  // 16
int second = dateTime.get(Calendar.SECOND);  // 17
21
Konstantin Spirin

Ouais, c'est en fait ce qui se passe. Voir aussi le Javadoc :

Returns:
   the year represented by this date, minus 1900.

La méthode getYear est obsolète pour cette raison. Alors, ne l'utilisez pas.

Notez également que getMonth renvoie un nombre compris entre 0 et 11. Par conséquent, this.sale.getSaleDate().getMonth() renvoie 1 pour février au lieu de 2. Alors que Java.util.Calendar n'ajoute pas 1900 à toutes les années, il souffre du problème du mois précédent.

Vous feriez bien mieux d'utiliser JodaTime .

9
jqno

La documentation Java suggère d'utiliser la classe Calendar à la place de cette méthode déconseillée Voici l'exemple de code permettant de configurer l'objet calendar

Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());

Voici l'exemple de code pour obtenir l'année, le mois, etc.

System.out.println(calendar.get(Calendar.YEAR));
System.out.println(calendar.get(Calendar.MONTH));

Calendar prend également en charge de nombreuses autres informations utiles, telles que TIME, DAY_OF_MONTH, etc. Voici la documentation les répertoriant toutes Notez que le mois est basé sur 0. Janvier est le 0ème mois.

7
Amol Dixit

La classe Java 8 LocalDate est une autre option pour obtenir l’année à partir d’un fichier Java.util.Date.

int year = LocalDate.parse(new SimpleDateFormat("yyyy-MM-dd").format(date)).getYear();

Une autre option est,

int year = Integer.parseInt(new SimpleDateFormat("yyyy").format(date));
7

tl; dr

LocalDate.now()       // Capture the date-only value current in the JVM’s current default time zone.
         .getYear()   // Extract the year number from that date.

2018

Java.time

Les classes Java.util.Date et Java.util.Calendar appartiennent toutes deux à l'héritage. Elles sont désormais supplantées par l'infrastructure Java.time intégrée à Java 8 et versions ultérieures. 

Un fuseau horaire est crucial pour déterminer une date. Pour un moment donné, la date varie autour du globe par zone. Par exemple, quelques minutes après minuit dans Paris France est un nouveau jour alors qu’il est encore «hier» dans Montréal Québec .

Si aucun fuseau horaire n'est spécifié, la machine virtuelle Java applique implicitement son fuseau horaire par défaut actuel. Ce défaut peut changer à tout moment, vos résultats peuvent donc varier. Il est préférable de spécifier explicitement votre fuseau horaire souhaité/attendu en tant qu'argument.

Spécifiez un nom du fuseau horaire } au format continent/region, tel que America/Montreal , Africa/Casablanca ou Pacific/Auckland. N'utilisez jamais les abréviations de 3-4 lettres telles que EST ou IST, car elles sont pas des fuseaux horaires véritables, non standardisés, et même pas uniques (!). 

ZoneId z = ZoneId.of( "Africa/Tunis" ) ;  

Si vous souhaitez uniquement la date sans heure, utilisez LocalDate . Cette classe manque d'informations sur le fuseau horaire, mais vous pouvez spécifier un fuseau horaire pour déterminer la date actuelle.

ZoneId zoneId = ZoneId.of( "America/Montreal" );
LocalDate localDate = LocalDate.now( zoneId );

Vous pouvez obtenir les différentes informations avec getYear, getMonth et getDayOfMonth. Vous obtiendrez le numéro d'année avec Java.time!

int year = localDate.getYear();

2016

Si vous voulez une date-heure au lieu d'une simple date, utilisez ZonedDateTime class.

ZonedDateTime zdt = ZonedDateTime.now( zoneId ) ;

À propos de Java.time

Le cadre Java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent les anciennes classes de date-heure, telles que Java.util.Date , .Calendar , & Java.text.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.

Une grande partie de la fonctionnalité Java.time est rétroportée vers Java 6 et Java 7 dans ThreeTen-Backport et est ensuite adaptée à Android dans ThreeTenABP (voir Comment utiliser… ).

Le projet ThreeTen-Extra étend Java.time avec des classes supplémentaires. Ce projet est un terrain d’essai pour d’éventuels ajouts à Java.time. Vous pouvez y trouver des classes utiles telles que Interval _, YearWeek , YearQuarter _ et plus _.

4
Basil Bourque

Ce comportement est documenté dans la documentation Java.util.Date -class:

Renvoie une valeur résultant de la soustraction de 1900 de l'année qui contient ou commence par l'instant dans le temps représenté par ceci Objet Date, tel qu'interprété dans le fuseau horaire local.

Il est également marqué comme obsolète. Utilisez Java.util.Calendar à la place.

1
esaj
        try{ 
int year = Integer.parseInt(new Date().toString().split("-")[0]); 
} 
catch(NumberFormatException e){
}

Une grande partie de la date est obsolète.

0
user287853