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 :

MessageFormat.format et java.time.LocaleDate, java.time.LocalDateTime, etc.


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 MessageFormat.format et java.time.LocaleDate, java.time.LocalDateTime, etc.
    Bonjour,

    Il y a un point où Java, que j'apprécie beaucoup, est particulièrement mauvais : la gestion des dates.

    Avec une nouvelle API proposée tous les cinq ans, jamais implémentée de manière totalement utilisable, on a subi en programmation tout ce que l'on pouvait de lourd.

    - java.util.Date aux setters dépréciés quasi d'origine et ne sachant pas bien gérer le siècle,
    - java.util.Calendar avec le mois basé sur zéro (on rêve !),
    - joda.time plus ou moins officiellement intégré, et puis non, on change tout en java.time, et refactoring partout...

    Java 8 n'y a encore pas manqué.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MessageFormat.format("C''est arrivé le : {0,date}", localDate);
    avec un java.time.LocalDate en paramètre.

    plante sur un "Cannot format given Object as a Date".
    Car l'API n'est, comme d'habitude, pas finie.
    Qu'on ne vienne pas me dire qu'il n'était pas possible de faire sa conversion, par défaut et à la volée, par le ZoneId du système en une java.util.Date pour faire que les centaines d'entrées de Resources.properties que j'ai et qui contiennent des dates puissent continuer à fonctionner sans interventions à tous les endroits où elles sont utilisées, dans le but d'y mettre une méthode privée qui alourdit le tout pour faire la conversion adéquate.

    Existe t-il une manière facile de résoudre se problème et pallier à ce nouvel échec des concepteurs de Java ?
    Je suis un peu exaspéré, j'en suis désolé, mais les dates en Java, je n'ai jamais vu un ratage pareil.

    Merci !

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


    En effet c'est vraiment une absence très regrettable !!!
    Le pire c'est que cela est pris en compte dans les Formatter (format()/printf()), donc l'absence dans MessageFormat est encore plus étrange.



    Après avoir matté un peu le code de MessageFormat/DateFormat, et je ne vois pas trop de solution transparente (il faudrait modifier des méthodes final ou private)

    Une solution serait toutefois de ré-implémenter la méthode static format() pour modifier les formatteurs avant d'effectuer le formattage.
    Bien sûr il faudra alors faire un refactoring pour remplacer les appels à MessageFormat.format() par cette nouvelle méthode statique.

    Exemple :
    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
        public static String format(String pattern, Object... arguments) {
            // 1. On crée l'instance de MessageFormat :
            MessageFormat mf = new MessageFormat(pattern);
            // 2. On analyse tous les Format du pattern :
            int i = 0;
            for (Format format : mf.getFormats()) {
                if (format instanceof DateFormat) {
                    // Et on englobe tous les DateFormats :
                    mf.setFormat(i, new DateFormatWrapper(format));
                }
                i++;
            }
            // 3. On effectue le formattage :
            return mf.format(arguments);
        }

    Avec le DateFormatWrapper défini de la manière suivante, afin de faire la conversion en java.util.Date si besoin :
    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
        private static class DateFormatWrapper extends Format {
     
            private final Format inner;
     
            DateFormatWrapper(Format format) {
                this.inner = format;
            }
            @Override
            public StringBuffer format(Object obj, StringBuffer toAppendTo, FieldPosition pos) {
                if (obj instanceof TemporalAccessor) {
                    final Instant instant;
                    if (obj instanceof LocalDate) {
                        instant = ((LocalDate) obj).atStartOfDay(ZoneId.systemDefault()).toInstant();
                    }  else if (obj instanceof LocalDateTime) {
                        instant = ((LocalDateTime) obj).atZone(ZoneId.systemDefault()).toInstant();
                    } else {
                        instant = Instant.from((TemporalAccessor) obj);
                    }
                    obj = Date.from(instant);
                }
                return inner.format(obj, toAppendTo, pos);
            }
     
            @Override
            public Object parseObject(String source, ParsePosition pos) {
                return inner.parseObject(source, pos);
            }
        }

    Pas top mais çà marche...


    a++

Discussions similaires

  1. DB time vs CPU time vs Elapsed time vs Waits
    Par zidane2012 dans le forum Oracle
    Réponses: 3
    Dernier message: 11/12/2012, 07h31
  2. Réponses: 1
    Dernier message: 26/07/2010, 16h38
  3. java.net.SocketTimeoutException: Read timed out
    Par riadhhwajdii dans le forum Tomcat et TomEE
    Réponses: 3
    Dernier message: 22/12/2009, 14h15
  4. java.net.ConnectException: Connection timed out: connect
    Par FrenchFrogger dans le forum Services Web
    Réponses: 1
    Dernier message: 10/02/2009, 14h38
  5. [API java.net] gestion du time out et de nombre de conn max
    Par java_fun dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 02/11/2006, 23h06

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