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

Java Discussion :

SimpleDateFormat parse ne récupère pas la bonne date


Sujet :

Java

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 7
    Points : 5
    Points
    5
    Par défaut SimpleDateFormat parse ne récupère pas la bonne date
    Salut à tous,

    J'essai d'utiliser le parse pour récupérer une date mais ça m'affiche 115 dans year au lieu de 2015 et 5 en mois au lieu de 6 voici mon code :



    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
     
     
     
    String t=rs.getString("DATEXPIRATION");
     
    System.out.println("la date en string de la base"+t);  // la ça m'affiche la date que veux
     
    SimpleDateFormat formater = null;
    java.util.Date date = null;
    formater = new SimpleDateFormat("dd-MM-yyyy HH-mm");
    date = formater.parse(t);
    System.out.println(" voila le resultat :: 2015-06-05 03:02:00.0'");
    //System.out.println("user gid de la base :"+rs.getString("USERGID"));
     
     
     
     
    System.out.println("minutes get minutes recup de la base"+date.getMinutes());
    System.out.println(" heures get hours recup de la base"+date.getHours());
    System.out.println(" jours get date recup de la base"+date.getDate());
    System.out.println(" mois  get month recup de la base"+date.getMonth());
    System.out.println("l anne get year recup de la base"+date.getYear());

    J'ai cherché toute la journée et essayer différent trucs d'ailleurs à la base j'utilisais des sql timestamp dans ma base mais quand je rentrais les valeurs dans la base avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    String sqlUsageControl ="INSERT INTO USAGECONTROL (FILEGID,USERGID,DATEXPIRATION,AUTORISATIONPARTAGE,AUTORISATIONTEMPORELLE) VALUES "
    						+"('"+fileGID+"','"+UserGID+"','"+stamp+"','"+autorisationpartage+"','"+autorisationtemporelle+"')";
    ça me rentrait 3915 au lieu de 2015 et un mois de plus, et la récupération de getTimestamp me retourner s'importe quoi, tout ça pour vous dire que j'ai essayé plein de trucs et là j'en ai un peu marre

    Merci à tous

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Je viens de...
    J'ai finalement transformé ma date en Caldendar ça m'affiche ma date correctement sauf pour le mois (pas le jour je me suis trompé)
    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
     
     // ma date : 5-6-2015 3-2
     
    Calendar c = Calendar.getInstance(); 
    c.setTime(date);
    int year = c.get(Calendar.YEAR);
    int month = c.get(Calendar.MONTH);
    int day = c.get(Calendar.DAY_OF_MONTH);
    int hours = c.get(Calendar.HOUR);
    int minutes = c.get(Calendar.MINUTE);
     
    System.out.println("l annee get year recup de la base"+year); 
    System.out.println("le mois get year recup de la base"+month); // m'afiche 5 au lieu de 6...
    System.out.println("le jour get year recup de la base"+day); 
    System.out.println("l heure get year recup de la base"+hours); 
    System.out.println("les minutes get year recup de la base"+minutes);

    j'aimerai aussi savoir pourquoi ça ne marche pas dans les autres cas... et puis surtout dans la base

    Edit :
    Au final je rajoute 1 au mois et ça fonctionne mais ça me semble un peu bourrin tout ça, mais bon j'ai quand même réglé tous mes problèmes mais je veux quand même savoir pourquoi ça ne marchait pas avant

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Remarque préliminaire : ça aurait rien changé à ton problème, mais au lieu de faire rs.getString() suivi d'un SimpleDateFormat, ça aurait été plus malin de faire directement rs.getTimestamp()... C'est juste plus simple et ça évite de te planter sur le format de date.

    Pareil pour ton insert, c'est pas comme ça qu'on fait, il faut utiliser les PreparedStatement... Pour les inserts et pour tout, d'ailleurs.

    Citation Envoyé par gatemehdi Voir le message
    Au final je rajoute 1 au mois et ça fonctionne mais ça me semble un peu bourrin tout ça, mais bon j'ai quand même réglé tous mes problèmes mais je veux quand même savoir pourquoi ça ne marchait pas avant
    Alors,
    - Pour l'année : Tu vois l'énorme message d'avertissement sur getYear() qui te dit en gros "Attention cette méthode est obsolète ne vous en servez pas ça ne peut qu'échouer" eh ben figure-toi qu'il t'a pas menti, il fallait vraiment pas s'en servir. Elle représente une antique manière de se représenter les dates, qui n'est plus d'actualité. Elle est encore là pour ne pas casser les codes préhistoriques qui s'en servaient.
    Ce même message d'avertissement indique aussi que cette méthode est remplacée par Calendar.get(Calendar.YEAR) - 1900, ça t'a vraiment donné aucun indice ?

    - Pour le mois : Bon, là effectivement, c'est la bibliothèque Java qui a fait un choix merdique.
    getMonth() et get(Calendar.MONTH) ne te renvoient pas 5 à proprement parler, il te renvoient Calendar.JUNE, une constante représentant la notion de mois de Juin... Et qui est représentée sous forme numérique dont la valeur est 5... C'est débile, on a remarqué. Il fallait repérer que c'est Calendar.JUNE et donc afficher l'information du mois de Juin.
    Enfin bon, j'ai du mal à croire que tu aies cherché si longtemps que ça. Quelle que soit la manière dont tu poses la question dans Google, tous les résultats des 37 premières pages t'expliquent en long en large et en travers ce qui se passe. N'hésite pas à te servir de Google et similaire, quand tu "essaies plein de choses et que tu vois pas quoi faire."

    "Est-ce qu'on est obligé de faire si compliqué ?" bah non. SimpleDateFormat ne sert pas qu'à parser des dates... Il les affiche très bien aussi.

    Et si ça peut te rassurer, dans Java 8 ils ont enfin admis que cette ancienne API de gestion de dates est pourrie, et en ont proposé une nouvelle. Elle fonctionne parfaitement.
    Les classes se trouvent dans le package java.time. L'ancienne classe Date est remplacée par Instant, mais pas mal de gens préfèrent utiliser LocalDateTime qui leur parlent mieux.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Remarque préliminaire : ça aurait rien changé à ton problème, mais au lieu de faire rs.getString() suivi d'un SimpleDateFormat, ça aurait été plus malin de faire directement rs.getTimestamp()... C'est juste plus simple et ça évite de te planter sur le format de date.
    justement j'avais utilisé let getTimestamp mais ça me retourné n'importe quoi! je ne comprenais pas du coup je l'ai mis en string pour régler mon problème.
    Je voulais d'abord avoir un truc fonctionnel (pour raison de temps) avant d'optimiser le tout.

    Pour le coup du -1900 c'est sur le sql timeStamp qui faut faire ça si j'ai bien compris (vu que dans ma base ça me mettait +1900) mais vu que les valeurs retournée par le getTimestamp sont erronés je ne vois trop comment récupérer une date (ou en insérer) dans une base (ça m'affichait minutes 0 heures 1 des trucs du genre)

    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
     
    Timestamp t=rs.getTimestamp("DATEXPIRATION");
    		System.out.println("Executing " + query);
    		  //  rs.next();
    			cpt++;
     
    			//java.sql.Date maDate = (java.sql.Date) resultset.getDate("MA_DATE"); 
    			Calendar c = Calendar.getInstance();
    			c.setTimeInMillis(t.getTime());
     
    			int year = c.get(Calendar.YEAR);  // affiche 1970 
    			int minutes = c.get(Calendar.MINUTE); // 1
    			int month = c.get(Calendar.MONTH)+1; // 1
    			int day = c.get(Calendar.DAY_OF_MONTH); // 1
    			int hours = c.get(Calendar.HOUR); // 0
    Est ce qu'il faut obligatoirement utiliser les PreparedStatement pour que ça marche ? Les valeurs dans la base sont correct(à 1900 année près) mais pas celle retourné par le getTimestamp (qui lui n'est pas depricated).

    Merci pour ces quelques précisions.

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    C'est très étrange. Ça laisse penser,
    - Soit que la colonne en question de ta base de données est de type caractères, et non pas un type date. Ce qui du coup empêche de faire getTimestamp(), mais c'est de la faute du concepteur de cette colonne. Il fallait la faire de type date.
    - Soit qu'il y a un énorme bug dans le pilote JDBC. Pourrait-on savoir quelle base de données tu utilises et d'où vient le pilote JDBC ?

    En tout cas, si getTimestamp() renvoie n'importe quoi, je comprendre que tu te sois rabattu sur getString(). Dans le monde réel, les choses sont bien conçues et on n'a pas besoin de ce genre de contournement.

    Citation Envoyé par gatemehdi Voir le message
    Pour le coup du -1900 c'est sur le sql timeStamp qui faut faire ça si j'ai bien compris (vu que dans ma base ça me mettait +1900)
    Il faut pas le faire du tout. Il faut utiliser un Calendar ou un SimpleDateFormat. Le +1900 n'est qu'une explication du pourquoi de la chose.

    Citation Envoyé par gatemehdi Voir le message
    Est ce qu'il faut obligatoirement utiliser les PreparedStatement pour que ça marche ?
    Non, il faut obligatoirement utiliser les PreparedStatement parce qu'ils savent mieux que toi ce qu'ils font.
    - S'il y a des ' ou des " ou des \ ou ce genre de choses dans tes String, PreparedStatement les échappera à ta place, systématiquement et sans erreur. Si tu le fais toi-même tu te tromperas forcément puisque tu n'y avais même pas pensé.
    - Pour les dates, il saura utiliser le format le plus adapté.... À condition quand même que ta base de données utilise un type date, ce qui ne semble pas être le cas. Mais dans ce cas elle est mal faite, et il faudra utiliser des String de toute façon. Quand les choses sont bien faites, PreparedStatement simplifie beaucoup.
    - Il y a aussi le fait que des ? ici ou là c'est nettement plus clair qu'une collection de "machin '" + truc + "' bidule '" + chouette + "' chose"
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par thelvin Voir le message
    C'est très étrange. Ça laisse penser,
    - Soit que la colonne en question de ta base de données est de type caractères, et non pas un type date. Ce qui du coup empêche de faire getTimestamp(), mais c'est de la faute du concepteur de cette colonne. Il fallait la faire de type date.
    - Soit qu'il y a un énorme bug dans le pilote JDBC. Pourrait-on savoir quelle base de données tu utilises et d'où vient le pilote JDBC ?
    Soit on n'a mis n'importe quoi dans cette table depuis le début, mais comme on l'a lu aussi n'importe comment, les deux n"importe quoi se compensent.

    Faudrait déjà que tu nous dise ce que tu appelle "erroné" au niveau du timestamp. Si la colonne est bien de type date (ou assimilé, datetime, timestamp, ...) en base, timestamp fonctionne toujours correctement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Date t=rs.getTimestamp("DATEXPIRATION");
    formater = new SimpleDateFormat("dd-MM-yyyy HH-mm");
    System.out.println("la date en string de la base "+formater.format(t));

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Oui mais...
    Le concepteur de la colonne c'est moi, je l'avais mis de type TIMESTAMP dans le create table, la base de donnée est une sqllite.

    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
     
    String query = "CREATE TABLE USAGECONTROL " +
    				"(FILEGID TEXT PRIMARY KEY NOT NULL, " +
    				 "USERGID INT NOT NULL,"+
    				 "DATEXPIRATION TIMESTAMP,"+  // c'est bien comme ça qu'il faut écrire ?
    				 "AUTORISATIONPARTAGE INT,"+
    				 "AUTORISATIONTEMPORELLE INT)"; 
     
    		System.out.println("Executing" +query);
    		try
    		{ 
    			stmt.executeUpdate(query); 
     
    		} 
    		catch (Exception ex) 
    		{ 
    			// error executing SQL statement 
    			System.out.println("Error: " + ex); 
    		}
    Avant d’insérer dans la base j'affiche la requête mes valeurs sont correct, c'est au moment de l'insertion (apparemment) et de la récupération que le problème se pose.


    Merci pour toutes vos réponses, je vais essayer de débugger tous ça et je vous rendrai une réponse.

Discussions similaires

  1. [GWT-Widget] SimpleDateFormat.parse() ne fonctionne pas
    Par touille dans le forum GWT et Vaadin
    Réponses: 4
    Dernier message: 27/05/2010, 18h05
  2. Probleme de conversion String -> Date avec SimpleDateFormat.parse(String)
    Par jeanlouis_lecodeur dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 02/07/2007, 09h18
  3. [Date et Calendar] Calendar ne revoie pas la bonne date
    Par Flophx dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 23/11/2006, 16h03
  4. Problème avec SimpleDateFormat.parse(Date)
    Par nad dans le forum Langage
    Réponses: 2
    Dernier message: 09/06/2006, 13h34
  5. je ne trouve pas la bonne syntaxe
    Par poelvo dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/08/2003, 01h30

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