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?
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.
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);
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);
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
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 .
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.
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));
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
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 ) ;
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 _.
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.
try{
int year = Integer.parseInt(new Date().toString().split("-")[0]);
}
catch(NumberFormatException e){
}
Une grande partie de la date est obsolète.