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

Langage Java Discussion :

[SimpleDateFormat] Date renvoyée incohérente


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juin 2004
    Messages
    143
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 143
    Par défaut [SimpleDateFormat] Date renvoyée incohérente
    Bonjour,

    J'ai créé différentes fonctions pour le traitement des dates, et je les tests grâce à junits !
    Il se trouve que ma fonction transformant une date String -> en date String formatée jj/MM/yyyy fonctionne mal. EN effet voici le résultat retourné par ma fonction (date passé en paramètre à gauche, date retournée à droite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    19/01/2006  :  19/01/2006
    19/01/06  :  19/01/0006
    19/1/2006  :  19/01/2006
    1/01/2006  :  01/01/2006
    19-01-2006  :  19/01/2006
    1-1-06  :  01/01/0006
    19 01 2006  :  19/01/2006
    1 1 06  :  01/01/0006
    19012006  :  19/01/2006
    010106  :  01/01/0006
    Voici mes fonctions :

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     
     
    public class TraiterDate {
     
     
     
    	/**
             * Différents formats de vérification des dates
             */
    	private static final DateFormat[] formats = {
    		new SimpleDateFormat("dd/MM/yyyy"),
    		new SimpleDateFormat("dd MM yyyy"),
    		new SimpleDateFormat("dd-MM-yyyy"),
    		new SimpleDateFormat("ddMMyyyy")
    	};
     
    	/**
             * Format de sortie pour toutes les dates de nos applications
             */
    	private static DateFormat STANDARD_DATE_FORMAT = new SimpleDateFormat("dd/MM/yyyy");
     
     
    	/**
             * Initialisation des formats de date
             */
    	static{
     
    		for(int i=0; i<formats.length;i++)
    			formats[i].setLenient(false);
    	}
     
     
     
    	/**
             * Fonction permettant de transformer une date au format String en date au format date si
             * le format de la date passée en paramètre correspond à un des formats que la MGPAT reconnais (table des formats)
             * @param date au format String à transformer en date
             * @return date ou null si date non reconnue
             */
    	public static Date stringToDate(String date)
    	{
    		Date dDate = null;
     
    		for(int i=0;i<formats.length;i++)
    		{
    			try
    			{
    				dDate = formats[i].parse(date);
    				return dDate;
    			}
    			catch(Exception e){};
    		}
     
    		return null;
    	}
     
     
    	/**
             * Fonction permettant de transformer une date String en date String formatée au standard MGPAT
             * @param date au format String à transformer
             * @return date au format String  transformée en date formatée au format standard de la MGPAT, si pas reconnu return chaine vide
             */
    	public static String dateCapturedToFormat(String date)
    	{
    		Date dDate = stringToDate(date);
    		return dDate == null ? "" : STANDARD_DATE_FORMAT.format(dDate);
    	}

  2. #2
    Membre expérimenté
    Inscrit en
    Juillet 2004
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 152
    Par défaut
    je ne vois pas où est l'incoherence.
    tous tes parsers attendent une année sur 4 caractères.

    si tu saisis l'année sur 2 caractères, les caractères manquants sont substitués par des 0

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    961
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 961
    Par défaut
    Citation Envoyé par http://java.sun.com/j2se/1.4.2/docs/api/java/text/SimpleDateFormat.html
    For parsing, if the number of pattern letters is more than 2, the year is interpreted literally, regardless of the number of digits. So using the pattern "MM/dd/yyyy", "01/11/12" parses to Jan 11, 12 A.D.

    For parsing with the abbreviated year pattern ("y" or "yy"), SimpleDateFormat must interpret the abbreviated year relative to some century. It does this by adjusting dates to be within 80 years before and 20 years after the time the SimpleDateFormat instance is created. For example, using a pattern of "MM/dd/yy" and a SimpleDateFormat instance created on Jan 1, 1997, the string "01/11/12" would be interpreted as Jan 11, 2012 while the string "05/04/64" would be interpreted as May 4, 1964. During parsing, only strings consisting of exactly two digits, as defined by Character.isDigit(char), will be parsed into the default century. Any other numeric string, such as a one digit string, a three or more digit string, or a two digit string that isn't all digits (for example, "-1"), is interpreted literally. So "01/02/3" or "01/02/003" are parsed, using the same pattern, as Jan 2, 3 AD. Likewise, "01/02/-3" is parsed as Jan 2, 4 BC.
    Il faut donc ajouter des formats avec "yy" pour l'année.

  4. #4
    Membre confirmé
    Inscrit en
    Juin 2004
    Messages
    143
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 143
    Par défaut
    En effet, si j'ai bien compris :

    Lors du parsing, phase qui consiste à vérifier le format, il suffit de mettre d/M/yy , pour vérifier tous les formats : d/M/yy ou dd/MM/yyyy etc ... cela importe peu car le parser sait qu'il doit attendre des jours suivis de mois suivis d'année

    Par contre pour le formatage, il faut absolument mettre dd/MM/yyyy qui sera le format exacte de sortie.

Discussions similaires

  1. [AC-2000] Fonction date renvoyant la valeur Null
    Par mcfly37 dans le forum IHM
    Réponses: 4
    Dernier message: 17/06/2009, 08h56
  2. [POO] gérer le type Date renvoyé par les activex
    Par Dung-Tri dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 25/09/2008, 18h52
  3. soustraire des dates et renvoyer le resultat
    Par tyrann dans le forum PostgreSQL
    Réponses: 7
    Dernier message: 18/11/2005, 14h52
  4. Renvoyer une date précise
    Par kilyn dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 05/10/2004, 10h11
  5. Votre avis : GregorianCalendar ou Date (SimpleDateFormat) ?
    Par MathiasM dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 28/09/2004, 16h43

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