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 :

Récupérer le jour d'une java.util.Date proprement (en évitant le signal deprecated).


Sujet :

Collection et Stream Java

  1. #1
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    605
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 605
    Points : 670
    Points
    670
    Par défaut Récupérer le jour d'une java.util.Date proprement (en évitant le signal deprecated).
    Bonjour,

    Mes fonctions reçoivent une java.util.Date et ont besoin d'en extraire le jour du mois par getDay() afin de se servir du nombre que cette fonction retourne. Néanmoins, comme vous le savez, cette fonction est dépréciée.
    (...et à mon avis, c'est une connerie. Les concepteurs de Java avaient mille autres choses utiles à faire que celle-là... Ou alors, il aurait fallu mettre les fonction de format dans Calendar également. On se retrouve avec deux objets distincts, incomplets chacun, pour gérer des dates...).

    Bien sûr, je pourrais me tourner vers la classe java.util.Calendar. mais mon but n'est pas de faire un refactoring de mes prototypes de méthodes.

    Comment puis-je obtenir proprement le jour d'une Date sans provoquer le warning de déprécation? (Bien entendu, je ne veux pas utiliser @SuppressWarnings("deprecated")).
    - Je dois la convertir en Calendar puis prendre son jour? C'est dur pour les performances, non?
    - Je dois faire un DateFormat, qui me donnera une String et la parser en Integer? C'est laid!

    Je veux faire ceci, sans recevoir de warning de déprécation.
    int jour = date.getDay();

    Quelle est la façon propre et efficace de le faire?

    En vous remerciant,

    Grunt.

  2. #2
    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 raison pour laquelle c'est déprécié, c'est qu'on ne peut pas fiablement extraire cette information avec le peu de données présentes dans Date. Pour avoir un jour, mois ou année, il faut un objet Date mais aussi un objet TimeZone. Car un même "java.util.Date" représente des jours / heures différentes dans chaque timezone. Et encore, en ne se basant que sur je Calendrier Grégorien, il existe aussi des tas d'autres Calendriers.

    Donc, utilisez un Calendar, et passez ce Calendar à vos méthodes. Ou alors passez un date et un TimeZone à vos méthodes et reconstruisez le Calendar.

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

    Citation Envoyé par grunt2000 Voir le message
    - Je dois la convertir en Calendar puis prendre son jour? C'est dur pour les performances, non?
    Oulà oui ! Il te faudra une machine de course pour faire cela !!!

    Plus sérieusement c'est ce qui est indiqué dans la documentation. Pourquoi voudrais-tu faire autrement ?

    Tu es en train de partir sur une solution bien crade qui risque d'être encore pire !

    Calendar reste la seule et unique solution en standard !


    Maintenant c'est vrai que l'API des Dates de Java n'est vraiment pas terrible, et si tu as de gros besoin là dessus tu pourrais opter pour une librairie externe bien plus complète comme JodaTime...


    a++

  4. #4
    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
    Citation Envoyé par adiGuba Voir le message
    Salut,

    Citation Envoyé par grunt2000
    - Je dois la convertir en Calendar puis prendre son jour? C'est dur pour les performances, non?
    De toute façon, Date.getDate() fonctionne à peine autrement... L'implémentation de calendrier y est plus rapide, mais la différence n'est pas notable non plus.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    605
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 605
    Points : 670
    Points
    670
    Par défaut
    Merci!

    Donc, quand dans une fonction j'utilise conjointement formattage de date et extraction de ses valeurs numériques, j'utiliserai toujours Calendar?

    Quel est l'intérêt, foncièrement, d'avoir deux objets distincts?

    Si Calendar a la bonne implémentation vis à vis des timezones, pourquoi Date ne reprend t-elle pas la même? Eventuellement, en se voyant rajouter des constructeurs pour recevoir ce Timezone?

    De plus, pourquoi s'il est celui à utiliser, tout est-il fait pour forcer le développeur à revenir au java.util.Date en permanence? Car le formattage des dates n'est pas accessible via un Calendar. Il peut y avoir mille vertueux qui recommandent l'emploi de Calendar, il y a dix mille programmeurs pour employer java.util.Date par grande commodité.

  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
    Paradoxalement, l'intérêt de Date est qu'il est indépendant de la TimeZone.

    Calendar, en permettant l'extraction des jours / heures / etc est lié à une TimeZone et un Calendrier. Bref à un point Géographique et un point culturel. Ainsi, nous somme le 24 janvier 2011 (Heure française) dans le Calendrier grégorien, mais nous sommes les 11 Janvier dans le Calendrier Julien.

    Date est un absolu, c'est un moment, un point dans le temps, totalement indépendant d'un quelconque point Géographique ou de préférences locale. C'est l'idéal pour la plupart des fonctions de calcul et pour le stockage (un Date n'est jamais qu'un coque autour d'un long). C'est parce que ces méthodes n'ont justement pas besoin d'informations supplémentaires qu'elles continuent de prendre un objet de type Date (que tu peux extraire de ton Calendar).

    Bref, Date est un "moment" et Calendar est la classe qui permet de le décortiquer.

    Enfin, si, DateFormat accepte Calendar (méthode setCalendar()), bien qu'il n'utilise pas le moment situé à l'intérieur.

  7. #7
    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
    Citation Envoyé par grunt2000 Voir le message
    Donc, quand dans une fonction j'utilise conjointement formattage de date et extraction de ses valeurs numériques, j'utiliserai toujours Calendar?
    Ou au moins quelque chose de très proche, qui n'a pas de différence notable.

    Citation Envoyé par grunt2000 Voir le message
    Quel est l'intérêt, foncièrement, d'avoir deux objets distincts?
    Bonne question, mais tu te trompes de cible. C'est l'existence de Date que tu devrais contester, pas celle de Calendar.

    Citation Envoyé par grunt2000 Voir le message
    Si Calendar a la bonne implémentation vis à vis des timezones, pourquoi Date ne reprend t-elle pas la même? Eventuellement, en se voyant rajouter des constructeurs pour recevoir ce Timezone?
    Une Date, classe assez mal nommée, représente un instant dans le temps, mais sans s'intéresser à où sur Terre.

    Si un parisen et un new-yorkais créaient un objet Date exactement à la même milliseconde, ces objets seraient 100% équivalents. Par contre, le parisien dirait qu'il est deux heures du mat' le 5 Janvier, et le new-yorkais dirait qu'il est vingt-deux heures le 4 Janvier. Pourtant ils parlent de la même Date.

    Bref : une Date n'a pas de TimeZone, c'est à ça qu'elle sert, à ne pas avoir de TimeZone. Elle représente un instant universel. C'est pour ça que quand on veut l'écrire, on doit indiquer pour quelle TimeZone.

    Citation Envoyé par grunt2000 Voir le message
    De plus, pourquoi s'il est celui à utiliser, tout est-il fait pour forcer le développeur à revenir au java.util.Date en permanence? Car le formattage des dates n'est pas accessible via un Calendar. Il peut y avoir mille vertueux qui recommandent l'emploi de Calendar, il y a dix mille programmeurs pour employer java.util.Date par grande commodité.
    Raison inverse : un Calendar a une TimeZone et représente donc un instant dans le temps à un certain endroit.
    C'est pratique pour faire des opérations calendaires, mais pas pour le reste.
    Il est plus propre de garder les instants dans le temps dissociés de toute TimeZone, et de les attacher à une TimeZone seulement à un moment où ça a du sens, pas avant ni après.

    Autrement dit, on manipule des Date sans TimeZone, et on les parse et les formate avec des DateFormat munis de TimeZones. Et on regarde leurs champs précis avec un Calendar muni de TimeZone.
    Pour tout le reste (les mettre dans ordre, les stocker en mémoire,) on a pas besoin de TimeZone. Pas besoin => pas tout court.

    C'est en tout cas le raisonnement qu'il y a derrière. Il est très discutable, et Joda-Time en tient un autre.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  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
    L'API de Date de Java n'est pas très "propre". Que ce soit java.util.Date (qui n'est pas immuable !) ou Calendar (d'utilisation hasardeuse).

    De plus il lui manque certains concepts (durée, intervalle)

    Ce n'est pas vraiment une API à prendre en exemple


    a++

  9. #9
    Membre régulier
    Homme Profil pro
    Développeur Java SE / Java EE
    Inscrit en
    Juillet 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java SE / Java EE
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2012
    Messages : 2
    Points : 71
    Points
    71
    Par défaut
    Je veux faire ceci, sans recevoir de warning de déprécation.
    int jour = date.getDay();
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    GregorianCalendar calendar = new GregorianCalendar();
    calendar.setTime(maDate);
    int jour = calendar.get(Calendar.DAY_OF_MONTH);

Discussions similaires

  1. Passer d'une date String à une java.util.Date
    Par Philcmoi dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 17/02/2013, 16h50
  2. [MySQL] Récupérer le jour sur une date
    Par Judgelolo dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 10/07/2012, 14h34
  3. [Dates] Récupérer le jour d'une date
    Par jeronimo83 dans le forum Langage
    Réponses: 2
    Dernier message: 30/07/2008, 11h27
  4. Réponses: 1
    Dernier message: 11/11/2007, 17h54
  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