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

Développement de jobs Discussion :

Talend & Heure d'été


Sujet :

Développement de jobs

  1. #1
    Membre éclairé Avatar de laloune
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mai 2005
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Mai 2005
    Messages : 487
    Par défaut Talend & Heure d'été
    Bonjour à tous,

    j'ai un problème à cause du passage à l'heure d'été (c'est dimanche ! on va dormir une heure de moins :-( )

    mon problème est que j'ai une start_date et une end_date. avec un tmap je boucle pour lister les dates comprises entre start_date et end_date. pour ca, j'ai dans le tmap un filtre qui regarde si la date est comprise entre start_date et end_date

    avec diffdate ca donne diffDate(datecourante,startdate)>=0 && diffDate(enddate,datecourante)>=0

    problème: si la datecourante est un jour de passage à l'heure d'été, alors la différence est de 1 heure (et non 0). du coup ca fausse le calcul.

    d'avance merci !

  2. #2
    Membre averti
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mars 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 28
    Par défaut
    Bonsoir,

    Je ne sais pas comment elle est codée la méthode diffDate!
    Je te conseille de calculer les timeStamp de startDate, currentDate et endDate, et tu fais ton contrôle... Avec les timeStamp, le pb de changement d'heure est dégagé.

    Calcul du timestamp (tout en bas du lien suivant):
    http://www.developpez.net/forums/d11...end-timestamp/

  3. #3
    Membre éclairé Avatar de laloune
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mai 2005
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Mai 2005
    Messages : 487
    Par défaut
    Bonjour Amansouri et merci pour ta réponse,

    en fait je ne vois pas trop comment le problème peut être dégagé enn utilisant les timestamp. J'ai essayé d'utilier getTime() et de faire la soustraction (au lieu d'utiliser TalendDate.diffDate), mais c'est pareil, ca me renvoie -82800 au lieu de -86400:

    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
    // code sample:
    //
    Date dateStart;
    Date dateEnd;
    String stringStart;
    String stringEnd;
     
    long diff;
     
    stringStart="2012-03-25";
    stringEnd="2012-03-26";
    dateStart=TalendDate.parseDate("yyyy-MM-dd", stringStart);
    dateEnd=TalendDate.parseDate("yyyy-MM-dd", stringEnd);
    diff=dateEnd.getTime()-dateStart.getTime();
     
    output_row.test=diff/1000;
    je ne sais pas trop comment résoudre le problème. Une idée ?

  4. #4
    Membre expérimenté
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Janvier 2011
    Messages
    201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2011
    Messages : 201
    Par défaut
    Bonjour,

    Entre le 25/03/2012 00h et le 26/03/2012 00h, il y a eu le changement d'heure et donc l'intervalle est bien de 23 h, soit 82800 secondes.

    Quelle est ta problématique?
    Si tu dénombres des données réparties équitablement dans le temps, il est normal que tu en aies 1/24 (=~4 %) en moins.

    Les trois dates que tu manipules (datecourante, startdate et enddate) ne connaissent rien entre 2h et 3h ce 25/03/12. Les tests de comparaison de date sont toujours pertinents les jours de changement d'heure.

  5. #5
    Membre éclairé Avatar de laloune
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mai 2005
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Mai 2005
    Messages : 487
    Par défaut
    Bonjour,

    désolé c'est effectivement un peu confus, je vais essayer de résumer un peu plus clairement

    j'ai effectivement 3 variables : currentDate, startDate et endDate. currentDate n'a pas d'heure (on la considère à 00:00), startDate et endDate oui.
    Donc j'ai 2 autres variables startDateMid et endDateMid qui sont leurs dates respectives à 00:00.

    je fais alors des comparaisons entre currentDate et start/end-DateMid ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (TalendDate.diffDate(currentDate, startDateMid)==0)
    afin de savoir si le jour est le même. Or ca n'a pas l'air de marcher les jours d changement d'heure, car le nombre d'heures est différent...

  6. #6
    Membre expérimenté
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Janvier 2011
    Messages
    201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2011
    Messages : 201
    Par défaut
    J'ai fait le test, avec une date définie au "25/03/12 à midi" et une au "25/03/12 à 2h".

    (Pour information, l'affichage de la date du "25/03/12 à 2h" retourne "25/03/12 à 3h", ce qui est correct)

    TalendDate.diffDate(out1.Midi,out1.DeuxHeures,"dd") me retourne 0
    TalendDate.diffDate(out1.Midi,out1.DeuxHeures,"HH") me retourne 9
    Sans mettre le 3ème paramètre, TalendDate.diffDate(out1.Midi,out1.DeuxHeures) me retourne 0.

    J'ai vérifié dans le code le TalendDate.diffDate. Si le troisième paramètre est absent, on appelle la méthode avec "dd".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        public static long diffDate(Date date1, Date date2) {
            return diffDate(date1, date2, "dd");
        }

    En synthèse, dans ton cas de comparaison de jours, la méthode diffDate(Date date1, Date date2) doit fonctionner, et répondre 0 pour toute date du 25/03/12

    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
        /**
         * return difference between two dates
         * 
         * @param Date1 ( first date )
         * @param Date1 ( second date )
         * @param dateType value=("yyyy","MM","dd","HH","mm","ss","SSS") for type of return
         * @return a number of years, months, days ... date1 - date2
         * 
         * {talendTypes} Long
         * 
         * {Category} TalendDate
         * 
         * {param} date(myDate) date1 : the first date to compare
         * 
         * {param} date(myDate2) date2 : the second date to compare
         * 
         * {param} String("MM") dateType : the difference on the specified part
         * 
         * {examples}
         * 
         * ->> diffDate(2008/11/24 12:15:25, 2008/10/14 16:10:35, "yyyy") : return 0
         * 
         * ->> diffDate(2008/11/24 12:15:25, 2008/10/14 16:10:35, "MM") : return 1
         * 
         * ->> diffDate(2008/11/24 12:15:25, 2008/10/14 16:10:35, "dd") : return 41 #
         */
        public static long diffDate(Date date1, Date date2, String dateType) {
     
            if (date1 == null) {
                date1 = new Date(0);
            }
            if (date2 == null) {
                date2 = new Date(0);
            }
     
            if (dateType == null) {
                dateType = "SSS";
            }
     
            Calendar c1 = Calendar.getInstance();
            Calendar c2 = Calendar.getInstance();
            c1.setTime(date1);
            c2.setTime(date2);
     
            if (dateType.equalsIgnoreCase("yyyy")) { //$NON-NLS-1$
                return c1.get(Calendar.YEAR) - c2.get(Calendar.YEAR);
            } else if (dateType.equals("MM")) { //$NON-NLS-1$
                return (c1.get(Calendar.YEAR) - c2.get(Calendar.YEAR)) * 12 + (c1.get(Calendar.MONTH) - c2.get(Calendar.MONTH));
            } else if (dateType.equalsIgnoreCase("HH")) { //$NON-NLS-1$
                return (date1.getTime() - date2.getTime()) / (1000 * 60 * 60);
            } else if (dateType.equals("mm")) { //$NON-NLS-1$
                return (date1.getTime() - date2.getTime()) / (1000 * 60);
            } else if (dateType.equalsIgnoreCase("ss")) { //$NON-NLS-1$
                return (date1.getTime() - date2.getTime()) / 1000;
            } else if (dateType.equalsIgnoreCase("SSS")) { //$NON-NLS-1$
                return date1.getTime() - date2.getTime();
            } else if (dateType.equalsIgnoreCase("dd")) {
                return (date1.getTime() - date2.getTime()) / (1000 * 60 * 60 * 24);
            } else {
                throw new RuntimeException("Can't support the dateType: " + dateType);
            }
        }

  7. #7
    Membre éclairé Avatar de laloune
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mai 2005
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Mai 2005
    Messages : 487
    Par défaut
    Bonjour NicolasTT et merci pour ta réponse,

    tout ce que tu dis est effectivement vrai.

    mais ce que je ne comprends pas, c'est que si je fais la différence entre "2012-03-26" et "2012-03-25" avec TalendDate.diffDate, il me retourne 0 !

    or on est bien d'accord que ce n'est pas le même jour...

    et effectivement, lorsque j'ajoute le paramètre "HH" pour l'avoir en heures, il me retourne 23

    du coup j'ai géré le cas en ajoutant une condition supplémentaire:

    if (TalendDate.diffDate(CurrentDate,endDateMid)==0 && Math.abs(TalendDate.diffDate(CurrentDate,endDateMid,"HH"))!=23)

    pas très élégant je pense, mais normalement ca fonctionne

  8. #8
    Membre éclairé Avatar de laloune
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mai 2005
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Mai 2005
    Messages : 487
    Par défaut
    bon j'en ai eu ma claque et j'ai utilisé une solution un peu bourrine mais qui a le mérite de fonctionner:

    -Duser.timezone=UTC dans les paramètres spécifiques JVM du job

    le problème de l'heure d'été ne se pose plus, du coup.

    merci pour votre aide en tous cas !

  9. #9
    Membre expérimenté
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Janvier 2011
    Messages
    201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2011
    Messages : 201
    Par défaut
    Bien vu, ton post a levé une anomalie Talend.
    J'allais la monter sur le bugtracker, mais cela a déjà été effectué, et corrigé pour la prochaine version :
    http://jira.talendforge.org/browse/TDI-17674

    C'était sous nos yeux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    } else IF (dateType.equalsIgnoreCase("dd")) {
         RETURN (date1.getTime() - date2.getTime()) / (1000 * 60 * 60 * 24);
    Une journée de 23 heures est donc vu comme une 0.96 journée, soit 0 !

    Cela est corrigé en allant chercher un paramètre du TimeZone.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    addDSTSavings = TimeZone.getDefault().getDSTSavings();
    dans /tos/trunk/org.talend.librariesmanager/resources/java/routines/TalendDate.java


    Bonne journée,

  10. #10
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Août 2008
    Messages : 108
    Par défaut
    Oui bien vu.

    Corrigé et disponible dans la V5.1.0 de Talend Open Studio for Data Integration, sortie la semaine dernière.

    Rémy.

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

Discussions similaires

  1. [CR ?] Somme d'heure sous Crystal ?
    Par Peter PARKER dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 17/04/2003, 16h24
  2. [VB6] [Datareport] Heure d'impression ds pied de page
    Par oazar dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 03/10/2002, 10h11
  3. Réponses: 11
    Dernier message: 23/07/2002, 14h33

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