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

VB.NET Discussion :

Impact des regional settings sur les données temporelles


Sujet :

VB.NET

  1. #1
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut Impact des regional settings sur les données temporelles
    Bonjour,

    Je viens vers vous pour savoir si quelqu'un aurait des infos sur l'impact que peuvent avoir les regional settings de windows sur un code utilisant des données temporelles* ?
    * C'est-à-dire utilisant des objets de types Timespan, Date et Datetime.

    Je pose cette question car j'ai remarqué hier qu'une petite application d'importation d'un fichier de pointage dans la DB tourne parfaitement quand elle est exécutée sous ma session mais pas quand elle est exécutée sous la session du user utilisée pour la tâche planifiée. Elle ne donnait aucune erreur et ne plantait. Juste que seulement certaines lignes du fichier semblaient être traitée et pas les autres. J'ai pas mal cherché avant d'avoir l'intuition que le problème venait des données temporelles. Du coup, j'ai pensé aux regional settings et j'ai constaté qu'ils étaient différents entre les 2 users. Après uniformasation, ça fonctionne parfaitement et je suis donc certain que le problème venait de là.

    Je cherche donc à savoir l'impact que ces derniers où sur les objets .NET traitant des données temporelles. Qu'il y ait un impact au niveau de l'affichage, je le conçois parfaitement. Mais pourquoi y en aurait-il un au niveau de la manipulation de l'objet, ça je ne comprends pas. Une durée X, peu importe qu'on l'affiche suivant le format A ou B, ça reste la même durée.

    J'ai tenté de chercher sur le net mais je n'utilise probablement pas les bons mots-clefs car je ne trouve rien sur ce sujet...

    Quelqu'un aurait-il donc des infos là-dessus ?

    Merci d'avance.
    Kropernic

  2. #2
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2014
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Août 2014
    Messages : 218
    Points : 493
    Points
    493
    Par défaut
    Bonjour,

    Citation Envoyé par Kropernic Voir le message
    Je viens vers vous pour savoir si quelqu'un aurait des infos sur l'impact que peuvent avoir les regional settings de windows sur un code utilisant des données temporelles* ?
    * C'est-à-dire utilisant des objets de types Timespan, Date et Datetime.

    Je pose cette question car j'ai remarqué hier qu'une petite application d'importation d'un fichier de pointage dans la DB tourne parfaitement quand elle est exécutée sous ma session mais pas quand elle est exécutée sous la session du user utilisée pour la tâche planifiée. .
    La réponse est sans doute dans le stockage des dates dans le fichier. Sinon, peut être que les requêtes d'insertion en base sont mal codées (passage de date sous forme de chaine aux commandes SQL).

    Pourrait on voir le contenu du fichier en question (enfin, un bout) ?
    Beaucoup trop d'hommes viennent au monde : l'Etat a été inventé pour ceux qui sont superflus. (Friedrich Nietzsche)

  3. #3
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Hello,

    Dans le fichier, les dates et les heures sont respectivement sous les formes suivantes "dd.MM.yyyy" et "hh,mm".

    Dans l'application, les données temporelles sont "parsées manuellement" (ie. sans utiliser date.parse par exemple). Je récupère les morceaux via des substrings et je fais New Date(year, month, day) avec. Pareil pour les heures et le constructeur de Timespan.

    Voici un bout de fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    "7628","XXXXXXXXXX","9999","","4129","","20.06.2015","01,23","E12900173","20.06.2015","3853","2,00"
    "7628","XXXXXXXXXX","9999","","4129","","22.06.2015","04,32","E12900173","20.06.2015","3853","3,00"
    "7628","XXXXXXXXXX","9999","","4129","","22.06.2015","03,32","E12900173","20.06.2015","3853","2,00"
    "7628","XXXXXXXXXX","9999","","4129","","24.06.2015","04,23","E12900173","20.06.2015","3853","4,00"
    "7628","XXXXXXXXXX","9999","","4129","","24.06.2015","03,59","E12900173","20.06.2015","3853","2,00"
    "7628","XXXXXXXXXX","9999","","4129","","25.06.2015","03,56","E12900173","20.06.2015","3853","4,00"
    "7628","XXXXXXXXXX","9999","","4129","","25.06.2015","03,14","E12900173","20.06.2015","3853","1,00"
    "7628","XXXXXXXXXX","9999","","4129","","26.06.2015","05,29","E12900173","20.06.2015","3853","3,00"
    "7628","XXXXXXXXXX","9999","","4129","","26.06.2015","02,17","E12900173","20.06.2015","3853","2,00"
    "7824","YYYYYYYYYY","9999","4134","4150","0135","02.07.2015","00,00","150084","02.07.2015","871","280,00"
    "7824","YYYYYYYYYY","9999","4134","4150","0135","02.07.2015","04,10","150084","02.07.2015","871","280,00"
    Les XXXX et YYYY étaient des noms que j'ai bien sûr masqués.
    Les dates sont en gras et les heures en italique.

    Le format des données dans le fichier est bien défini et parfaitement respecté à chaque fois. C'est moche à traiter (les substring) mais une fois que c'est fait, ça fonctionne sans souci. Je ne pense donc pas que le souci viennent du fichier.
    Kropernic

  4. #4
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2014
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Août 2014
    Messages : 218
    Points : 493
    Points
    493
    Par défaut
    Citation Envoyé par Kropernic Voir le message
    Le format des données dans le fichier est bien défini et parfaitement respecté à chaque fois. C'est moche à traiter (les substring) mais une fois que c'est fait, ça fonctionne sans souci. Je ne pense donc pas que le souci viennent du fichier.
    OK. Et pour le codage des commandes d'insertion ? Y'a pas un "ToString" qui traine quelque part ?
    Beaucoup trop d'hommes viennent au monde : l'Etat a été inventé pour ceux qui sont superflus. (Friedrich Nietzsche)

  5. #5
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Non non. Tout passe par des procédures stockées et leur paramètres. Je ne fais aucune requête "en dur" vers sql server.

    Exemple d'une procédure pour vous convaincre ^^ :
    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
    ALTER PROCEDURE [S_HP].[UP_SAVE_PRESTATION_HOURS]
        @CODE    SMALLINT,
        @PED_ID    INT,
        @STR_ID    TINYINT,
        @HOURS    TIME,
        @DATE    DATE
    AS
    BEGIN
        SET NOCOUNT ON;
     
        IF @CODE > 4000
            IF EXISTS (    SELECT    1 
                        FROM    S_HP.T_PRESTATION_OWN_PSO
                        WHERE    PSO_DATE = @DATE
                            AND JJD_ID = (    SELECT    JJD_ID
                                            FROM    S_HP.TJ_JPS_DEP_JJD JJD
                                                        INNER JOIN T_DEPARTEMENT_DEP DEP
                                                            ON    JJD.DEP_ID = DEP.DEP_ID
                                            WHERE    JJD.PED_ID = @PED_ID
                                                AND STR_ID = @STR_ID
                                                AND DEP.DEP_CODE = @CODE - 4000
                                                AND @DATE BETWEEN JJD_START AND JJD_END))
                UPDATE    S_HP.T_PRESTATION_OWN_PSO
                SET        PSO_DURATION = DATEADD(SECOND, DATEDIFF(SECOND, 0, CAST(@HOURS AS DATETIME)), PSO_DURATION)
                WHERE    PSO_DATE = @DATE
                    AND JJD_ID = (    SELECT    JJD_ID
                                            FROM    S_HP.TJ_JPS_DEP_JJD JJD
                                                        INNER JOIN T_DEPARTEMENT_DEP DEP
                                                            ON    JJD.DEP_ID = DEP.DEP_ID
                                            WHERE    JJD.PED_ID = @PED_ID
                                                AND STR_ID = @STR_ID
                                                AND DEP.DEP_CODE = @CODE - 4000
                                                AND @DATE BETWEEN JJD.JJD_START AND JJD.JJD_END)
            ELSE
                INSERT INTO S_HP.T_PRESTATION_OWN_PSO(JJD_ID, PSO_DATE, PSO_DURATION)
                SELECT    JJD_ID,
                        @DATE,
                        @HOURS
                FROM    S_HP.TJ_JPS_DEP_JJD JJD
                            INNER JOIN T_DEPARTEMENT_DEP DEP
                                ON    JJD.DEP_ID = DEP.DEP_ID
                WHERE    JJD.PED_ID = @PED_ID
                    AND JJD.STR_ID = @STR_ID
                    AND DEP.DEP_CODE = @CODE - 4000;
        ELSE
            IF EXISTS (    SELECT    1
                        FROM    S_HP.T_PRESTATION_DEMO_PSD
                        WHERE    PSD_DATE = @DATE
                            AND JJC_ID = (    SELECT    JJC_ID    
                                            FROM    S_HP.TJ_JPS_CONT_JJC JJC
                                                        INNER JOIN S_CONTRAT.T_CONTRAT_DEMO_CONT CONT
                                                            ON    JJC.CONT_ID = CONT.CONT_ID
                                            WHERE    JJC.PED_ID = @PED_ID
                                                AND JJC.STR_ID = @STR_ID
                                                AND CONT.CONT_CODEDEMO = RIGHT('0000' + CAST(@CODE AS VARCHAR(4)),4)
                                                AND @DATE BETWEEN JJC.JJC_START AND JJC.JJC_END))
                UPDATE    S_HP.T_PRESTATION_DEMO_PSD
                SET        PSD_DURATION = DATEADD(SECOND, DATEDIFF(SECOND, 0, CAST(@HOURS AS DATETIME)), PSD_DURATION)
                WHERE    PSD_DATE = @DATE
                    AND JJC_ID = (    SELECT    JJC_ID    
                                    FROM    S_HP.TJ_JPS_CONT_JJC JJC
                                                INNER JOIN S_CONTRAT.T_CONTRAT_DEMO_CONT CONT
                                                    ON    JJC.CONT_ID = CONT.CONT_ID
                                    WHERE    JJC.PED_ID = @PED_ID
                                        AND JJC.STR_ID = @STR_ID
                                        AND CONT.CONT_CODEDEMO = RIGHT('0000' + CAST(@CODE AS VARCHAR(4)),4)
                                        AND @DATE BETWEEN JJC.JJC_START AND JJC.JJC_END)    
            ELSE
                INSERT INTO S_HP.T_PRESTATION_DEMO_PSD(JJC_ID, PSD_DATE, PSD_DURATION)
                SELECT    JJC_ID,
                        @DATE,
                        @HOURS
                FROM    S_HP.TJ_JPS_CONT_JJC JJC
                            INNER JOIN S_CONTRAT.T_CONTRAT_DEMO_CONT CONT
                                ON    JJC.CONT_ID = CONT.CONT_ID
                WHERE    JJC.PED_ID = @PED_ID
                    AND JJC.STR_ID = @STR_ID
                    AND CONT.CONT_CODEDEMO = RIGHT('0000' + CAST(@CODE AS VARCHAR(4)),4);
    END
    Kropernic

  6. #6
    Membre expérimenté

    Homme Profil pro
    Responsable des études
    Inscrit en
    Mars 2009
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2009
    Messages : 553
    Points : 1 672
    Points
    1 672
    Par défaut
    Deux pistes au hasard:
    Dans certains pays, la date s'écrit plutôt MM.dd.yyyy (inversion du mois et du jour par rapport à ce qu'on fait en France).
    Quant aux heures, dans certains pays on utilise la notation sur 24 heures, mais dans d'autres c'est sur 12 heures + indication AM/PM.

  7. #7
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Citation Envoyé par nnovic Voir le message
    Deux pistes au hasard:
    Dans certains pays, la date s'écrit plutôt MM.dd.yyyy (inversion du mois et du jour par rapport à ce qu'on fait en France).
    Quant aux heures, dans certains pays on utilise la notation sur 24 heures, mais dans d'autres c'est sur 12 heures + indication AM/PM.
    Oui mais comme je le dis dans mon premier message. Ceci n'est qu'une question d'affichage. En mémoire, qu'on soit à paris ou à tombouktou, c'est stocké pareil.

    Et mon fichier est correctement traité vu qu'il n'utilise pas les fonctions de parsing du framework mais un "parsing maison".
    Kropernic

  8. #8
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2014
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Août 2014
    Messages : 218
    Points : 493
    Points
    493
    Par défaut
    Citation Envoyé par nnovic Voir le message
    Deux pistes au hasard:
    Dans certains pays, la date s'écrit plutôt MM.dd.yyyy (inversion du mois et du jour par rapport à ce qu'on fait en France).
    Quant aux heures, dans certains pays on utilise la notation sur 24 heures, mais dans d'autres c'est sur 12 heures + indication AM/PM.
    Argument totalement inopérant. Les paramétres de globalisation n'ont pas d'influence sur les stockages typés mais, de fait, uniquement sur les méthodes Parse etToString.
    Beaucoup trop d'hommes viennent au monde : l'Etat a été inventé pour ceux qui sont superflus. (Friedrich Nietzsche)

  9. #9
    Membre expérimenté

    Homme Profil pro
    Responsable des études
    Inscrit en
    Mars 2009
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2009
    Messages : 553
    Points : 1 672
    Points
    1 672
    Par défaut
    Je n'ai pas assez de détails sur ton problème pour en juger...
    Il faudrait que tu précises quelques points:
    - comment est généré le fichier que tu veux importer ? C'est peut-être lui qui subit l'influence des différences de paramètres régionaux, et pas ton programme.
    - as-tu vérifier, en pas à pas, que c'est bien le traitement de la date et/ou l'heure qui empêche certaines lignes d'être traîtées ? Les paramètres régionaux influent sur bien d'autres choses.

    (je pense en particulier aux décimaux, où le séparateur est tantôt un point, tantôt une virgule... et comme les champs de ton fichier semblent être séparés par des virgules, justement ...)

  10. #10
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Citation Envoyé par nnovic Voir le message
    - comment est généré le fichier que tu veux importer ? C'est peut-être lui qui subit l'influence des différences de paramètres régionaux, et pas ton programme.
    Ce fichier est généré par un système tiers et placé sur un disque réseau. Mon programme ne fait qu'aller chercher ce fichier pour le traiter. Que ce soit avec un user ou l'autre, le fichier est strictement le même. Le problème ne vient donc pas de là.

    Citation Envoyé par nnovic Voir le message
    - as-tu vérifier, en pas à pas, que c'est bien le traitement de la date et/ou l'heure qui empêche certaines lignes d'être traîtées ? Les paramètres régionaux influent sur bien d'autres choses.
    L'utilisateur qui posent problème est un utilisateur qui sert à faire tourner les tâches planifiées. Je ne peux donc pas me connecter avec pour lancer VS2013 et faire du debug.
    Kropernic

  11. #11
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2014
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Août 2014
    Messages : 218
    Points : 493
    Points
    493
    Par défaut
    Citation Envoyé par Kropernic Voir le message
    L'utilisateur qui posent problème est un utilisateur qui sert à faire tourner les tâches planifiées. Je ne peux donc pas me connecter avec pour lancer VS2013 et faire du debug.
    Ceci dit, tu peux te mettre les même settings et faire du debug.
    Beaucoup trop d'hommes viennent au monde : l'Etat a été inventé pour ceux qui sont superflus. (Friedrich Nietzsche)

  12. #12
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    C'est pas faux...

    Cela dit, si j'en viens à faire cela, ce ne sera pas avant lundi car :
    1. j'aimerais autant ne pas toucher à la config de mon laptop
    2. j'ai autre chose de plus urgent sur le feu
    3. j'suis en congé jusqu'à lundi à partir de ce soir
    Kropernic

Discussions similaires

  1. Cube : gestion des droits (rôles) sur les données
    Par classal dans le forum Pentaho
    Réponses: 1
    Dernier message: 02/09/2013, 15h24
  2. Filtre sur les données des 3 derniers mois?
    Par Arkalys dans le forum Access
    Réponses: 2
    Dernier message: 21/10/2005, 09h02
  3. changer des regional settings en c
    Par thomas_b dans le forum Windows
    Réponses: 2
    Dernier message: 21/06/2004, 15h44

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