
FAQ JavaConsultez toutes les FAQ
Nombre d'auteurs : 53, nombre de questions : 231, dernière mise à jour : 7 juin 2009
Sommaire→Généralités→Gestion des dates- Comment connaître l'heure courante ?
- Comment mettre à jour l'heure courante du système ?
- Comment faire des opérations sur des dates ?
- Comment convertir une date en chaîne ?
- Comment convertir une chaîne en Date ?
- Comment connaître la date de création d'un fichier ?
- Comment forcer le parsing d'une Date à échouer en cas de Date incorrecte ?
- Comment vérifier la validité d'une date ?
Le constructeur par défaut de la classe java.util.Date construit une date initialisée à l'heure courante du système.
On peut également utiliser la méthode System.currentTimeMillis() pour récupérer le timestamp courant.
Si vous utilisez des instances de java.util.Date et de java.sql.Date dans le même programme, il est possible de convertir les deux formats de dates :
java.util.Date uDate = new java.util.Date();
java.sql.Date sDate = new java.sql.Date(System.currentTimeMillis());
/*
* Conversion entre les 2 types de dates
*/
sDate = new java.sql.Date(uDate.getTime());
uDate = new java.util.Date(sDate.getTime());
Lien : Comment convertir une date en chaîne ?
Lien : Comment mettre à jour l'heure courante du système ?
L'API standard ne permet pas de modifier l'heure du système. La seule solution est de passer par une commande externe.
Lien : Comment exécuter une application externe ?
Lien : Comment connaître l'heure courante ?
Tout est prévu, il n'y a qu'à utiliser les classes de Sun tel que :
- java.util.GregorianCalendar
- java.util.Calendar
- java.util.Date
Tout d'abord il nous faut une instance de GregorianCalendar
GregorianCalendar calendar = new java.util.GregorianCalendar();
// Initialisé à la date et l'heure courrante.
calendar.setTime( maDate );
// Initialisé avec une instance de Date.
Voici ensuite quelques exemples d'opération (pour plus d'information lire la doc, évidemment...)
- sur le champs "jour" (7 jours plus tôt) :
calendar.add (Calendar.DATE, -7);
- sur le champs "mois" (5 mois plus tard) :
calendar.add (Calendar.MONTH, 5);
Et pour ce qui est des affichages je vous conseille d'utiliser la solution proposée ici en utilisant la méthode
public Date calendar.getTime ();
La conversion d'une date en chaîne de caractères est délicate au premier abord. En effet, le format des dates est très différent d'une langue à l'autre. Heureusement, les fonctions d'internationalisation de Java vont faire le travail à notre place...
// IMPORT
import java.util.Locale;
import java.text.DateFormat;
// 1. Choix de la langue
Locale locale = Locale.getDefault();
/** 2. Construction du DateFormat en choisiant un format :
* SHORT = 01/01/2002
* FULL = lundi 1 janvier 2002
*/
DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.FULL, locale);
// 3. Affichage
System.out.println(dateFormat.format(maDate));
Si vous souhaitez utiliser un format de sortie plus exotique, vous pouvez accéder directement à la classe java.text.SimpleDateFormat.
DateFormat dateFormat = new SimpleDateFormat("hh'h'mm dd-MM-yy");
//résultat : "23h59 31-12-2000"
Pour convertir une chaine en date, il faut connaître le format de la date. Par défaut, une seule classe dans l'API gère les formats de date : java.text.SimpleDateFormat. On utilise le parser de date pour effectuer la conversion. Voici une méthode générique :
public static Date stringToDate(String sDate, String sFormat) throws Exception {
SimpleDateFormat sdf = new SimpleDateFormat(sFormat);
return sdf.parse(sDate);
}
Le parser déclenche l'exception ParseException quand la chaine ne respecte pas le format. La documentation sur java.text.SimpleDateFormat décrit le format d'une date, et des lettres à utiliser pour caractériser le jour, le mois, ... etc.
Cette méthode est valable à partir du JDK 1.1
Un exemple d'utilisation est fourni en téléchargement.
Lien : Comment convertir une date en chaîne ?
Téléchargement : Exemple d'utilisation.
long dateModification = monFichier.lastModified();
Toutefois, le long retourné par la méthode lastModified() peut dépendre du système d'exploitation et donc ne pas être toujours extrêmement précise.
Par défaut la classe DateFormat essaie d'interpréter une date incorrecte. Ainsi le 31 février 2000 retournera un objet Date valide.
Date d = new SimpleDateFormat("dd/MM/yyyy").parse("31/02/2000");
System.out.println("Date: " + d);
Ce code retourne la date suivante: Thu Mar 02 00:00:00 CET 2000
Pour forcer la classe SimpleDateFormat à retourner une erreur, il faut utiliser la méthode setLenient(false).
Le code suivant retournera une exception:
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
sdf.setLenient(false);
System.out.println("Date: " + sdf.parse("31/02/2000"));
java.text.ParseException: Unparseable date: "31/02/2000"
Il faut utiliser la propriété Lenient de l'objet Calendar, cela forcera le parsing de la date à échouer si la date est invalide.
Les messages d'exceptions indique même d'ou vient l'erreur ("MONTH", "DAY_OF_MONTH").
On peut donc utiliser ce problème en parsant la date et en voyant s'il y a une erreur :
public boolean estValide(int annee, int mois, int jour){
Calendar c = Calendar.getInstance();
c.setLenient(false);
c.set(annee,mois,jour);
try{
c.getTime();
}
catch(IllegalArgumentException iAE){
return false;
}
return true;
}
Remarques :
- Ne pas oublier que pour un objet Calendar les mois commence à 0 et les jours à 1
- L'exception est relevée lors du getTime() et non pas du set(), donc vous pourrez créer un calendar non valide mais pas l'utiliser
Lien : Comment forcer le parsing d'une Date à échouer en cas de Date incorrecte ?


















