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 :

Récupérer une date au sein d'un String Java


Sujet :

Langage Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 87
    Points : 59
    Points
    59
    Par défaut Récupérer une date au sein d'un String Java
    Bonjour à tous,

    j'ai fait le parsing d'un fichier XML qui contient des durées de temps sous cette forme: PT27M42.560S ca revient à dire 27min, 42sec et 560 millisec

    La forme originale est bien sur un String, comment je peux récupérer la date a partir de cette forme "PT27M42.560S"

    Merci d'avance

  2. #2
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2011
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2011
    Messages : 366
    Points : 1 361
    Points
    1 361
    Par défaut
    Ce sont bien des durées (et pas des dates) que tu veux récupérer?

    Version simple:
    Si le format est toujours PT minutes M secondes . millisecondes S, qu'est ce qui t'empêche d'écrire un petit parser à la main?

    Version regexp (mieux):
    Est ce que tu as regardé du coté des expressions régulières en Java? Comme Pattern et Matcher?
    les raisonnables ont duré, les passionné-e-s ont vécu

  3. #3
    Membre expérimenté Avatar de supergeoffrey
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2010
    Messages
    795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Octobre 2010
    Messages : 795
    Points : 1 685
    Points
    1 685
    Par défaut
    Bonjour,

    Je pense que tu es sur la bonne voie. Tu postes une question sur le forum à chaque fois que tu as une chose de moins à faire.
    Tu pourrais utiliser la classe java.text.SimpleDateFormat . Si tu l'utilise directement reconstruit une string en supprimant les lettres.

    Sinon j'ai une petite classe qui pourrais t'aider simplement

    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
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
     
    import java.text.FieldPosition;
    import java.text.ParseException;
    import java.text.ParsePosition;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.HashMap;
    import java.util.Map;
     
    /**
     * <p>
     * {@link SimpleDateFormat} ne gérant pas les lettre dans les format, {@link ComplexDateFormat} permettra de les gerer
     * en les protégeant avec un \
     * </p>
     * 
     * <p>
     * exemple : System.out.println(new ComplexDateFormat("hh\\Hmm").format(new Date())); affichera l'heure
     * </p>
     * 
     * @author gboulay
     * 
     */
    public class ComplexDateFormat extends java.text.DateFormat
    {
     
        /**
         * 
         */
        private static final long serialVersionUID = 145465464L;
        private final SimpleDateFormat formater;
        private Map<Integer, Character> protectedCharacters;
        private static final char SUBSTITUTION = '.';
     
        public ComplexDateFormat(String format)
        {
            super();
            StringBuffer buffer = new StringBuffer();
            protectedCharacters = new HashMap<Integer, Character>();
            int i = 0;
     
            while (i < format.length())
            {
                if (format.charAt(i) == '\\')
                {
                    try
                    {
                        protectedCharacters.put(buffer.length(), format.charAt(i + 1));
                        buffer.append(SUBSTITUTION);
                        i += 2;
                    }
                    catch (ArrayIndexOutOfBoundsException e)
                    {
                        throw new IllegalArgumentException("dernier caractère protégé non saisi", e);
                    }
                }
                else
                {
                    buffer.append(format.charAt(i++));
     
                }
     
            }
            formater = new SimpleDateFormat(buffer.toString());
        }
     
        @Override
        public StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition fieldPosition)
        {
            if (date == null)
            {
                return toAppendTo;
            }
            StringBuffer aux = formater.format(date, new StringBuffer(), fieldPosition);
            for (Integer i : protectedCharacters.keySet())
            {
                aux.replace(i, i + 1, protectedCharacters.get(i).toString());
            }
            return toAppendTo.append(aux.toString());
        }
     
        @Override
        public Date parse(String source, ParsePosition pos)
        {
            if (source == null || source.equals(""))
            {
                return null;
            }
            StringBuffer buffer = new StringBuffer();
            for (int i = 0; i < source.length(); i++)
            {
                if (protectedCharacters.containsKey(i))
                {
                    buffer.append(SUBSTITUTION);
                }
                else
                {
                    buffer.append(source.charAt(i));
                }
            }
            return formater.parse(buffer.toString(), pos);
        }
     
    }
    qui pourrait d'aider et ensuite dans ta classe tu fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
         ComplexDateFormat cdf = new ComplexDateFormat("\\P\\Tmm\\Mss.SSS\\S");
          Date date = cdf.parse(maDateParse);
    un petit exemple pour la route

    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
     
        public static void main(String[] args)
        {
            ComplexDateFormat a = new ComplexDateFormat("\\A=yyyy \\M=MM \\J=dd");
            System.out.println(a.format(new Date()));
            try
            {
                System.out.println(a.parse("A=2011 M=04 J=26"));
            }
            catch (ParseException e)
            {
                e.printStackTrace();
            }
            System.out.println();
            ComplexDateFormat b = new ComplexDateFormat(
                                                        "\\I \\L\\o\\v\\e \\Y\\o\\u dd/MM/yyyy hh:mm:ss \\s\\o \\m\\u\\c\\h");
            System.out.println(b.format(new Date()));
            try
            {
                System.out.println(b.parse("I Love You 15/03/2010 17:25:30 so much"));
            }
            catch (ParseException e)
            {
                e.printStackTrace();
            }
        }
    Pensez à marquer vos tickets comme résolus.
    Pensez aussi aux pour les réponses pertinantes

    Quand une discution est résolue depuis un moment pour revenir dessus, il est mieux d'en crée une nouvelle avec un lien vers l'autre car :
    • Elle sera en haut du forum, elle sera donc plus visible
    • Une discussion résolue, on ne passe pas dessus pour aider, on passe dessus si on a le même problème
    • Tu demandes surement à tes clients de faire le même

  4. #4
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Bonjour,

    Une date a un jour, un mois et une année; donc c'est quoi ton vrai besoin? Transformer "PT27M42.560S" en format "27min, 42sec et 560 millisec" ?
    Si c'est le cas, regarde du coté regexp.

    A+.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 87
    Points : 59
    Points
    59
    Par défaut
    @rmaker: en fait j'ai les deux, des durées et des heures exactes
    merci pour la piste de regexp je vais voir qu'est ca va donner
    merci

    @supergeoffrey: merci beaucoup pour la classe, c tré gentil, je vais la tester je reviens

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 87
    Points : 59
    Points
    59
    Par défaut
    une informations supplémenttaire, voici des exemples de chaines à traiter:

    PT2M25.360S = 2min 25sec et 360 millisec
    PT3M3.840S = 3 min 3sec et 840 millisec

    je ne sais pas si la classe que tu m'a fourni pourrait m'aider ou pas vu que les minutes peuvent etre un chiffre ou deux


    Merci de m'aider

  7. #7
    Membre averti
    Avatar de omar344
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2007
    Messages
    287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2007
    Messages : 287
    Points : 301
    Points
    301
    Par défaut
    L'utilisation des dates pourrait te servir

  8. #8
    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 omar344 Voir le message
    L'utilisation des dates pourrait te servir
    Tu peux créer tes propres formats, et les manipuler à ta guise
    Vu qu'il s'agit de durée et pas de date, c'est pas super super.

    Citation Envoyé par devhercule
    Oui c'est bien le cas, le probleme c'est que je connais pas ce regexp
    Eh bien, c'est le moment d'apprendre les regex en Java .

    Sinon, tu peux aussi décider de faire un split() sur tout ce qui n'est pas un chiffre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String s = "PT27M42.560S";
    String[] parts = s.split("[^\\d]+");
    Ça te renverra un tableau qui contient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {"", "27", "42", "560"}
    'Suffit d'ignorer la chaîne vide au début.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    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
    des durées ne sont pas des dates, c'est donc inutile (voir dangereux) de vouloir stocker ça dans une objet de type date.

    Le mieux c'est de stocker ça dans un long ou un object customizé, pour la lecture, comme précisé, une petite regexp est c'est emballé, puisque le format est semble-t-il:

    PT<1 ou plusieurs chiffres>M<1 ou plusieurs chiffres>.<1 ou plusieurs chiffres>S


    cette regexp basique devrait d'ailleur faire l'affaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PT([0-9]+)M([0-9]+)\.([0-9]+)S

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 87
    Points : 59
    Points
    59
    Par défaut
    Merci beaucoup tchize
    je vais essayer ca aussi

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Récupérer une date depuis une page ASP dans une BDD
    Par franckrichard57 dans le forum ASP
    Réponses: 2
    Dernier message: 22/03/2007, 11h31
  2. Controle d'une Date declaré par le type String.
    Par Mobistar dans le forum Langage
    Réponses: 4
    Dernier message: 21/01/2007, 15h46
  3. [Conception] Récupérer une date au format francophone
    Par HwRZxLc4 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 08/11/2006, 16h15
  4. Réponses: 5
    Dernier message: 01/06/2006, 11h36
  5. Réponses: 1
    Dernier message: 07/06/2005, 14h00

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