IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API standards et tierces Java Discussion :

Utilisation du SimpleDateFormat


Sujet :

API standards et tierces Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de hadler
    Inscrit en
    Décembre 2004
    Messages
    91
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Décembre 2004
    Messages : 91
    Par défaut Utilisation du SimpleDateFormat
    Bonjour à tous,

    J'ai un soucis dans l'utilisation de la classe SimpleDateFormat.

    à la base, je reçois une date sous forme de String et sous le format ISO 8601:2000 (sYYYY-MM-DDThh:mm:ss.sssTZD)

    J'ai donc fait une méthode pour vérifier la validité de la date que je reçois, et je n'arrive pas à la faire fonctionner.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    private Date stringToDate() {
    	try {
    		String sDate = "2009-08-24T10:20:30.290-04:00" ;
            SimpleDateFormat sdf = new SimpleDateFormat("syyyy-MM-dd'T'hh:mm:ss.sssTZD");
            return sdf.parse(sDate);
            }
    	catch (Exception error) {
    			error.printStackTrace(); 
    			return null ;
    	}
    }
    je reste bloqué avec le message d'erreur suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    java.lang.IllegalArgumentException: Illegal pattern character 'T'
    	at java.text.SimpleDateFormat.compile(Unknown Source)
    	at java.text.SimpleDateFormat.initialize(Unknown Source)
    	at java.text.SimpleDateFormat.<init>(Unknown Source)
    	at java.text.SimpleDateFormat.<init>(Unknown Source)
    	at be.fgov.minfin.drmc.wsecm.mainTest.stringToDate(mainTest.java:138)
    	at be.fgov.minfin.drmc.wsecm.mainTest.controlDataType(mainTest.java:122)
    	at be.fgov.minfin.drmc.wsecm.mainTest.getQuery(mainTest.java:81)
    	at be.fgov.minfin.drmc.wsecm.mainTest.run(mainTest.java:37)
    	at be.fgov.minfin.drmc.wsecm.mainTest.main(mainTest.java:25)
    Si quelqu'un à la solution, ou bien une autre méthode pour vérifier la validité de ma date, je suis preneur.

    Merci.

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Ton pattern de date est incorrect.

    De plus SimpleDateFormat n'utilise pas exactement le même format pour les fuseaux horaires. Par exemple GMT-4 s'écrit -0400 et non pas -04:00 ce qui pose problème.

    Il faut "adapter" la date AVANT de la parser.

    Il faut également penser à désactiver le mode lenient (qui tente de corriger les dates incorrectes), et vérifier que la totalité de la chaine soit bien lu, ce qui pourrait donner quelque chose comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    	public static Date iso2Date(String isoDate) throws ParseException {
    		// On vérifie le format du fuseau horaire :
    		int len = isoDate.length();
    		if (len==29 && isoDate.charAt(26)==':') {
    			// On supprime les ':' du fuseau horaire
    			isoDate = isoDate.substring(0, 26) + isoDate.substring(27);
    			len--;
    		}
    		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SSSZ");
     
            sdf.setLenient(false); // Interdit la correction des dates invalides
     
            // Et on parse() en vérifiant que toute la chaine soit bien lu :
            ParsePosition pp = new ParsePosition(0);
            Date date = sdf.parse(isoDate, pp);
            if (pp.getIndex()!=len) {
                throw new ParseException("Unparseable date: \"" + isoDate + "\"" ,
                		pp.getErrorIndex());
            }
            return date;
    	}
    a++

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut
    Une autre option serait d'utiliser la bibliothèque Joda-Time qui est bien plus stricte quant au standard ISO 8601.

  4. #4
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2006
    Messages
    245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 245
    Par défaut
    bonjour, pourquoi ne pas utiliser une expression régulière? C'est un outils bien puissant.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Mois inatendu en utilisant SimpleDateFormat
    Par GREGOIRE TARDY dans le forum Langage
    Réponses: 2
    Dernier message: 18/09/2014, 12h52
  2. [SimpleDateFormat] utilisation
    Par Lady_jade dans le forum Collection et Stream
    Réponses: 10
    Dernier message: 27/10/2005, 08h48
  3. utilisation du meta type ANY
    Par Anonymous dans le forum CORBA
    Réponses: 1
    Dernier message: 15/04/2002, 12h36
  4. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 16h01
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo