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 :

java.util.Date est-il obsolète ?


Sujet :

Langage Java

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2016
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2016
    Messages : 37
    Points : 39
    Points
    39
    Par défaut java.util.Date est-il obsolète ?
    bonjour,

    la classe Date m'est bien utile car c'est celle qui me permet d'exploiter des dates, venant d'une bdd, sans avoir à passer par un converter.
    Seulement, ses methodes getXXX() sont toutes deprecated. Je veux bien accepter le changement, mais j'utilise quoi en attendant ?
    ...la classe Calendar ? ...et après, pour persister en base, je re-cast en Date ?

    J'ai comme l'impression d'être passé à cotés de quelque chose de capital au sujet des dates, mais quoi ?

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    En Java 8, l'API java.time permet de gérer les dates et autres éléments temporels de manières plus simple. Avant, il y avait l'API tierce JodaTime.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    J'aurais tendance à penser que tu es passé à côté de SimpleDateFormat... mais je peux me tromper
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2016
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2016
    Messages : 37
    Points : 39
    Points
    39
    Par défaut
    merci d'y répondre, joel.
    Par contre, je me sens comme davantage embourbé dans la mélasse
    En réalité, si les méthodes getXXX() fonctionnent encore dans 5 ans, mon problème est résolu ! ...mais la qualification "deprecated" ne me laisse pas serein.
    D'un cotés, j'ai un bean Entity qui me deal du java.util.date ...et il faudrait que je transite par une autre classe pour exploiter les données que contiennent ces dates ?
    Ce n'est pas le passage d'un format à l'autre qui me rebute, mais le fait de n'avoir pas d'autres choix.
    Mon code n'est pas toujours propre, mais là ça fait carrément tâche.

    @ Obutterlin,
    merci je vais regarder ça ...mais je n'y crois plus trop, à vrai dire lol

  5. #5
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    En gros, j'ai l'impression que ton problème c'est la transition, entre l'époque de java.util.Date (et son faux jumeau maléfique Calendar), et l'époque du java.time. Une réflexion à priori partagée par ceux qui sont à l'origine de ce tutoriel. En attendant, la dépréciation n'empêche pas effectivement d'utiliser les méthodes dont tu parles. Je n'y connais rien à ce que tu appelles Entity (je suppose que ça a un rapport avec Hibernate ou un truc comme ça), et je ne perçois pas le problème comme toi : je n'ai simplement jamais utilisé de ma vie les getters de la classe java.sql.Date. Peut-être auras-tu des indices de réponse dans ce tutoriel à ce sujet.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  6. #6
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Euh, je ne comprends pas ton problème là...
    Les entity mappent facilement (et automatiquement) une java.sql.Date en java.util.Date... du coup, où est ton problème ?

    Sinon, tu passes d'un type à l'autre très facilement par code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime());
     
    java.util.Date utilDate = new java.util.Date(sqlDate.getTime());
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2016
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2016
    Messages : 37
    Points : 39
    Points
    39
    Par défaut
    pour faire court, joel, je laisse JPA se charger du mapping : il me génère automatiquement mes @Entity à partir de la structure des tables de la bdd.
    Un champ date, dans une des tables, me donne un attribut de type java.util.date dans l'entity qui correspond à cette table.
    Je n'ai aucun contrôle (me semble-t-il) sur la façon dont JPA génère ces entity, et il fait le choix de java.util.date.
    Cette classe date, elle me convient bien, elle fait le taf et tout
    ...mais ses get() sont étiquetés "deprecated" ...et en guise de solution de remplacement, on te propose de te prendre la tête, tout simplement !


    @ Obutterlin
    oui nickel, ça map bien, tranquille ...c'est juste l'étiquetage deprecated qui me pose problème
    ...parce que d'une certaine manière ça m'oblige à passer par un autre format de date pour faire ma cuisine, puis de repasser en util.date si je veux répercuter en base
    Il n'y a que moi qui trouve ça crade ou quoi ? lol

  8. #8
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Il y a peu de chance que les méthodes dépréciées de la classe Date disparaissent, cela casserait trop de code.

    Toutefois cela ne change rien au fait que l'API de la classe Date est toute pourrie !
    Déjà elle n'est pas immuable, ce qui oblige à faire plein de copie défensive sous peine de provoquer des bugs.
    Et elle représente une date au format GMT, mais ses méthodes l'adapte au timezone courant, ce qui peut être troublant dans certains cas.
    Sans compté l'héritage bien particulier de tout cela (java.util.Date parent de sql.Date, sql.Time et sql.Timestamp alors que c'est des notion plutôt différente).
    Et ne parlons même pas de Calendar...


    Tu gagnerais fortement à passer à la nouvelle API de Date !



    Pour JPA apparemment il suffit de définir un convertisseur pour que le mapping soit automatique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class LocalDateAttributeConverter implements AttributeConverter<LocalDate, java.sql.Date> {
     
        @Override
        public java.sql.Date convertToDatabaseColumn(LocalDate localDate) {
        	return (localDate == null ? null : java.sql.Date.valueOf(localDate));
        }
     
        @Override
        public LocalDate convertToEntityAttribute(java.sql.Date sqlDate) {
        	return (sqlDate == null ? null : sqlDate.toLocalDate());
        }
    }

    Idem pour sql.Time/LocalTime et sql.Timestamp/LocalDateTime...


    a++

  9. #9
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Pour JPA apparemment il suffit de définir un convertisseur pour que le mapping soit automatique :
    Ce n'est même pas la peine de te casser la tête, l'annotation @Temporal marche très bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "DISPLAY_END", length = 26)
    public Date getDisplayEnd()
    {
        return this.displayEnd;
    }
    (avec TemporalType.DATE ou TemporalType.TIME)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par IDtalc Voir le message
    Il n'y a que moi qui trouve ça crade ou quoi ? lol
    Ben, oui

    Blague à part, personnellement, ça ne me pose aucun problème, et je n'utilise aucune méthode @Deprecated (là j'ai du mal à comprendre ce que tu fais si toi tu les utilises)
    Le seul moment où on se pose la question de la représentation d'une date c'est dans l'IHM et là, en fonction de la techno utilisée, ce sera plus ou moins évident. Avec JSF c'est trivial (encore plus avec Primefaces)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2016
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2016
    Messages : 37
    Points : 39
    Points
    39
    Par défaut
    ...que de complications je trouve !
    Je crois que je vais mettre cette affaire de cotés pour l'instant, car si il y a un choix à faire à ce niveau, je n'ai pas encore tous les éléments pour trancher.
    J'espère seulement que je n'aurai pas à choisir quel fuseau horaire indiquait minuit lorsque jésus a trépassé ...
    Il est clair que j'ai largement sous-estimé ce problème de date, pensant que tant que je me tenais à distance de l'horizon d'un trou noir je n'avais pas trop à m'en soucier. Que nenni !
    N’interprétez pas, j'ai rien contre les black. Merci pour vos com, j'y reviendrai au moment opportun

  12. #12
    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
    bah y a pas vraiment super compliqué

    Le vieux trucs mal ficelés d'il y a 20 ans

    java.util.Date: contrairement à ce que son nom indique, c'est un timestamp absolu, indépendant de la position dans l'espace. à 10h00 en Angleterre et 11H00 en France, il est le même java.util.Date
    java.sql.Date: type utlisé par jdbc pour mapper les colonne de type Date sql. C'est un java.util.Date dont on retire les heure comme on peu, parce qu'on ignore la timezone à utiliser
    java.sql.Time: type utlisé par jdbc pour mapper les colonne de type Time sql. C'est un java.util.Date dont on retire les jour comme on peu, parce qu'on ignore la timezone à utiliser
    java.sql.TimeStamp: type utlisé par jdbc pour mapper les colonne de type TimeStamp sql. C'est un java.util.Date
    java.util.Calendar: api de manipulation de dates dans une timezone & calendrier (ajout / extraction d'heures, de jours, de semaines). Peut être mappé en jdbc vers des colonne "date/time/timestamp" ou "date/time/timestamp with timezone". On y retrouve un calendrier julien, un calendrier grégorien et d'autres calendriers bizarres dans des apis à part


    Les nouveau trucs à préférer
    LocalDate: une date, sans tenir compte de la timezone. Autrement dit, si je fais tourner un code à Paris et à Sidney, vers minuit, on aura pas la même valeur pour représenter la LocalDate. Exemple d'utilisation: une date d'anniversaire
    LocalTime: une heure, sans tenir compte de la timezone. Exemple d'utilisation: une heure dans un planning simple: on mange à 13:00
    LocalDateTime: une date + heure sans tenir compte de la timezone. Exemple: naissance: "né le 5/2/74 à 11:35"
    OffsetDateTime: date + heure dans une timezone. Exemple d'utilisation: agenda: "rendez vous le 15/7/2016 à 13:00 UTC" qui est la même chose que "rendez vous le 15/7/2016 à 14:00 GMT+1", timestamp
    Duration: une durée de temps exprimée en heures. Exemple: ce film dure 2h30:45s, le temps de travail réglementaire est de 38h00 par semaine,...
    Period: une durée de temps exprimée en jour. Exemple: Ce projet est estimé à 6mois, et 15 jours. Cette personne à 25ans, 4mois et 24jours

  13. #13
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par OButterlin Voir le message
    Ce n'est même pas la peine de te casser la tête, l'annotation @Temporal marche très bien
    Sauf erreur l'annotation @Temporal fonctionne seulement pour java.util.Date.

    Les convertisseurs permettent de mapper avec les types de la nouvelles API de date (LocalDate, LocalTime, LocalDateTime...)


    a++

  14. #14
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Effectivement, ça ne fonctionne pas avec les nouveaux types (uniquement java.util.Date et java.util.Calendar), j'étais resté dans son problème de base
    On est en retard ici, on tourne en java 7...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  15. #15
    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
    la nouvelle api date de java 8, de manière assez logique, on verra surement arriver le support jpa pour cette api dans java EE 8, prévu si je ne m'abuse pour début 2017

  16. #16
    Membre actif
    Homme Profil pro
    Développeur
    Inscrit en
    Décembre 2008
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Décembre 2008
    Messages : 101
    Points : 256
    Points
    256
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Les nouveau trucs à préférer
    LocalDate: une date, sans tenir compte de la timezone. Autrement dit, si je fais tourner un code à Paris et à Sidney, vers minuit, on aura pas la même valeur pour représenter la LocalDate. Exemple d'utilisation: une date d'anniversaire
    LocalTime: une heure, sans tenir compte de la timezone. Exemple d'utilisation: une heure dans un planning simple: on mange à 13:00
    LocalDateTime: une date + heure sans tenir compte de la timezone. Exemple: naissance: "né le 5/2/74 à 11:35"
    OffsetDateTime: date + heure dans une timezone. Exemple d'utilisation: agenda: "rendez vous le 15/7/2016 à 13:00 UTC" qui est la même chose que "rendez vous le 15/7/2016 à 14:00 GMT+1", timestamp
    Duration: une durée de temps exprimée en heures. Exemple: ce film dure 2h30:45s, le temps de travail réglementaire est de 38h00 par semaine,...
    Period: une durée de temps exprimée en jour. Exemple: Ce projet est estimé à 6mois, et 15 jours. Cette personne à 25ans, 4mois et 24jours
    Et il manque la classe Instant

Discussions similaires

  1. Cast de java.util.DATE à java.sql.DATE
    Par mnemonic78 dans le forum Langage
    Réponses: 6
    Dernier message: 05/01/2007, 08h21
  2. Java 5.0 et java.util.Date
    Par Royd938 dans le forum Langage
    Réponses: 4
    Dernier message: 10/07/2006, 12h19
  3. Conflit entre java.util.Date et class java.sql.Date
    Par vonitiana dans le forum Langage
    Réponses: 3
    Dernier message: 30/06/2006, 11h43
  4. de java.sql.Date à java.utile.Date
    Par Sniper37 dans le forum API standards et tierces
    Réponses: 10
    Dernier message: 23/05/2006, 16h10
  5. Réponses: 4
    Dernier message: 06/02/2004, 16h23

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