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

Collection et Stream Java Discussion :

SimpleDateFormat, spécifier une valeur par défaut


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    196
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 196
    Par défaut SimpleDateFormat, spécifier une valeur par défaut
    Bonjour

    Pour des commandes consoles, j'utilise SimpleDateFormat avec le masque suivant : MM:dd/HH:mm:ss
    Il a été convenu avec les utilisateurs que l'année ne sert pas à grand chose, d'où son absence la dedans.

    Sauf que la date résultante est du coup en 1970. Pas glop. Ma question est donc, peut on spécifier une partie des valeurs par défaut ? Je viens de tester sdf.set2DigitYearStart(new Date()), ça ne fonctionne pas.

    Sinon je peux toujours faire un work around à grand coup de calendrier, setYear, getYear mais c'est assez moche.

  2. #2
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    tu fais comment ? un bout de code pour mieux comprendre..:

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    196
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 196
    Par défaut
    J'utilise args4j, et donc j'ai une classe DateOptionHandler avec le parser de date.

    Voici le code, avec le contournement à coup de calendrier

    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
    22
    23
    	public int parseArguments(Parameters parameters) throws CmdLineException {
     
    		try {
    			// Set up parser and calendars
    			SimpleDateFormat sdf = new SimpleDateFormat("MM:dd/HH:mm:ss");
    			Calendar result = Calendar.getInstance();
    			Calendar now = Calendar.getInstance();
     
    			// fetch date
    			String value = parameters.getParameter(0); 
    			result.setTime(sdf.parse(value));
     
    			// As year is not present in the parsing, the default value will be 1970.
    			// So we set the result year to actual year
    			result.set(Calendar.YEAR, now.get(Calendar.YEAR));
     
    			setter.addValue(result.getTime());
    			return 1;
     
    		} catch (ParseException e) {
    			throw new CmdLineException(this.owner, e);
    		}
    	}
    En fin de compte c'est pas si moche que ça. Mais je maintiens ma question, par pure curiosité

  4. #4
    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,


    Tu peux avoir des soucis les années bissextiles, car le 29 février ne sera pas trouvé en 1970 et tu passeras au 1 mars !

    Le mieux serait de rajouter la date dans le pattern et dans le texte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    		// Set up parser and calendars
    		int year = Calendar.getInstance().get(Calendar.YEAR);
    		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM:dd/HH:mm:ss");
     
    		// fetch date
    		String value = parameters.getParameter(0); 
    		result.setTime(sdf.parse(year+"-"+value));



    Attention également à quelques particularités qui pourrait surprendre :
    • Le SimpleDateFormat est par défaut très indulgent : c'est à dire qu'il acceptera des dates comme le "32 janvier" par exemple, en les corrigeant (ici cela donnerait le "1 février"). Ce comportement n'est peut être pas souhaitable car il peut masquer des erreurs de saisie :
    • Le parse() ne traitera pas forcément TOUTE la chaine : si une date peut être lu les caractères supplémentaire peuvent être ignoré sans provoquer d'exception. Encore une fois il y a un risque d'erreur et de comportement non-voulu !
      Pour éviter cela il faut vérifier que la chaine soit entièrement lu, par exemple avec une méthode comme ceci :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      	public static Date parseAll(DateFormat format, String source) throws ParseException {
      		ParsePosition pos = new ParsePosition(0);
      		Date date = format.parse(source, pos);
      		// S'il n'y a pas eu d'erreur mais qu'on n'a pas traité toute la chaine :
      		if (pos.getErrorIndex()<0 && pos.getIndex()!=source.length()) {
      			pos.setErrorIndex(pos.getIndex());
      		}
      		if (pos.getErrorIndex()>=0) {
      			throw new ParseException("Unparseable date: \"" + source + "\"" ,
      					pos.getErrorIndex());
      		}
      		return date;
      	}



    a++

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    196
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 196
    Par défaut
    Très intéressantes remarques, je te remercie.

    Ta version "rajouter la date dans le pattern et dans le texte" répond tout à fait à ma question initiale, sujet résolu

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 30/04/2009, 14h21
  2. mettre une valeur par défaut
    Par oolon dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 05/12/2006, 17h20
  3. Réponses: 2
    Dernier message: 15/03/2006, 09h44
  4. [PEAR][HTML_QuickForm] Attribution d'une valeur par défaut à un select
    Par mohican13 dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 24/02/2006, 08h08
  5. Réponses: 6
    Dernier message: 14/02/2006, 20h53

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