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

Silverlight Discussion :

Problème conversion de date


Sujet :

Silverlight

  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Avril 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2010
    Messages : 152
    Par défaut Problème conversion de date
    Bonjour,

    J'ai un petit soucis quand je récupère une date de la base de données. Par ex, la date stockée est 04/11/2011 mais quand je la récupère dans mon application SL, la date affichée est 03/11/2011.

    Je suppose que c'est un problème de CultureInfo, alors j'ai ajouté un bloc à mon web.config :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <system.web>
    <globalization
    fileEncoding="utf-8"
    requestEncoding="utf-8"
    responseEncoding="utf-8"
    culture="fr-FR"
    uiCulture="fr-FR"
            />
    Mais ça n'a pas résolu mon problème. Vous auriez une idée sur comment initialiser la culture (IUCulture ou CultureInfo, je sais pas trop), dès le lancement de mon appli, sans devoir mettre des convertToLocalTime à chaque fois qu'il y a une date?

    Merci

  2. #2
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Avril 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2010
    Messages : 152
    Par défaut
    Re bonjour,

    Bon il s'agit pas d'un problème de cultureInfo finalement, je l'ai setté dans mon app.cs au "fr-FR" et ça n'a pas résolu mon problème.

    Mon diagnostic était erroné : En effet, quand la date stockée dans ma base de données est, par exemple, 04/04/2011 00:00:00, la date que mon appli récupère est 03/04/2011 23:00:00. Je m'en suis pas rendu compte parce que je n'affiche que la date et pas l'heure.

    Ma question maintenant : Comment dire que toutes les dates doivent être converti en localTime, sans le faire à chaque fois que j'ai une variable de type DateTime (j'en ai plein en plus )

    Merci

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Par défaut
    Est-ce que ton serveur est en France ?

    Parce que moi j'ai un serveur pour SQL Server aux US et pour mettre la bonne date (et la bonne heure) la seule solution est de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      maDate= DateTime.Now.ToUniversalTime().AddHours(clsGlobal.heureEteHiver());
    Donc l'idée c'est de partir du temps Universel et là, je rajoute une heure en hiver et 2 heures quand on est à l'heure d'été (ou le contraire).

  4. #4
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2011
    Messages : 82
    Par défaut
    Bonjour,

    CultureInfo est ton probleme en effet.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <TextBlock Text="{Binding Path=Date, StringFormat='dddd d MMMM yyyy', ConverterCulture=fr-FR}"/>

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Par défaut
    Si ta date stockée est 4 novembre 2011 pourquoi est-ce qu'une cultureinfo la ferait passer à 3 novembre 2011 ?

    A la limite, la cultureinfo te l'affichera
    4 November 2011 plutôt que
    4 Novembre 2011

    4/11/2011 c'est la date que tu crois avoir stockée ? ou tu la vois vraiment en sqlServer ?

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Avril 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2010
    Messages : 152
    Par défaut
    bonjour Vinchenzo.939 et Golzinne et navré pour cette réponse tardive.

    Finalement je pense qu'il s'agit bien d'un problème de cultureInfo, je suis obligé de mettre un ConvertToLocalTime() à chaque fois que je récupère une date de la base de données. Pourtant j'ai sétté le cultureInfo a FR-fr dans l'App.xaml.cs mais ça n'a pas résolu mon problème, parce qu'en debug, le Kind de ma date est UTC et non pas Local.

    Je me suis trouvé obligé de rajouter le Convert à toutes mes dates (Je fais le binding dans le code behind et non pas dans le XAML).

    S'il n y a pas de solution plus simple à cet erreur, je trouve ça dommage.

    Merci quand même, et bonne semaine.

  7. #7
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    J'ai l'impression que ce qu'il se passe, c'est que ton serveur SQL Server n'est pas à la même heure que ton serveur IIS.

    => Genre le serveur SQL Server est configuré comme ayant la date UTC, mais en réalité, a l'heure française.

    Du coup, lorsque ton serveur IIS, qui est configuré avec l'heure française interroge SQL Server, il converti l'heure UTC en heure française... sauf que l'heure UTC était erronnée à la base.

    C'est en tout cas ce qu'il devrait se passer.

  8. #8
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Eventuellement, pour corriger le problème, regarde s'il y a des options "timezone" et "daylightsaving" dans la balise "globalization". Si c'est le cas, alors tu dois pouvoir résoudre ton problème en forçant ces deux valeurs sur IIS de façon à retrouver la même configuration que sur SQL Server.

    Attention : le timezone (et je pense, la culture) influe sur les dates pivot de daylightsaving ! En effet, tous les pays dans le monde ne changent pas d'heure en été, mais sur tout, ils ne changent pas tous d'heure le même jour !

    Pour ta culture personnelle, et pour comprendre à quel point il est important de correctement remplir les informations régionales à l'installation d'un serveur :

    http://en.wikipedia.org/wiki/Daylight_saving_time

  9. #9
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Avril 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2010
    Messages : 152
    Par défaut
    Bonjour StringBuilder,

    J'avais déjà vérifié cette éventualité : Mon serveur est bien sur le même fuseau horaire que mon poste de dev ("Madrid, Paris" pour le serveur, "(UTC+01:00) Bruxelles, Copenhague, Madrid, Paris" pour le poste de dev) et ils sont réglés à la même heure aussi (à une minute près)...

    Merci quand même!

  10. #10
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Et le paramètre de l'heure d'été est bon aussi ?

    Aussi, je n'ai aucune idée de comment ça a évolué mais...

    Sous Windows NT4 (il me semble sous 2000 aussi) lorsqu'on installait le serveur, il demandait les informations régionales (heure, timezone et daylight saving).

    Ensuite, lorsqu'on activait IIS ou SQL Server, ils utilisaient l'information paramétrée à ce moment. On avait beau la changer ensuite dans le compte administrateur, les changements étaient ignorés.

    Donc avoir la date correcte dans les menus "paramètres régionaux" depuis le compte admin (ou autre) n'est pas forcément un gage de réglage correct.

    Interroge directement la base de données avec le compte SA.

    Aussi, depuis IIS, demande-lui d'afficher ces informations.

    Elles peuvent éventuellement être différentes (encore une fois, je ne sais aps comment ça a évolué avec Windows Server 2003 et 2008), mais il est tout à fait logique qu'une modification des préférences utilisateurs (même si c'est l'administrateur) influe de quelle que façon que ce soit les services du serveur.

  11. #11
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Avril 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2010
    Messages : 152
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    Interroge directement la base de données avec le compte SA.
    Je sais pas si ça répond à ton interrogation, mais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT
    CONVERT(VARCHAR(8),GETDATE(),108) AS HourMinuteSecond,
    CONVERT(VARCHAR(8),GETDATE(),101) AS DateOnly
    GO
    =>

    à l'instant même!

    EDIT : En SA bien entendu!!

  12. #12
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2011
    Messages : 82
    Par défaut
    En fait le pb est plus complexe que ca, et pas forcement lie a ta BDD.
    C'est ton application qui est sous mauvaise Culture.
    Une app Silverlight est par defaut en English, avec les . a la place des virgules et les formats de date a l'envers.

    Comme je te le disais tu peux preciser ton CultureInfo sur les champs date pour recuperer le format normal.

    Si tu veux passer toute ton appli en fr-FR :
    -Attaque ton fichier host (la page aspx qui heberge ton xap)
    -ligne 67&68 (culture et uiculture)
    -modifie le code par value="fr-FR"

    Tu peux faire encore plus propre :
    -Attaque ton fichier app.xaml.cs (c'est ton application Silverlight)
    -Dans le constructeur (app()) ajoute
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR")
    Thread.CurrentThread.CurrentUICulture = new CultureInfo("fr-FR")
    comme ca ta langue est propre a ton xap, rien ne deborde cote apsx.

  13. #13
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Avril 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2010
    Messages : 152
    Par défaut
    Bonjour Vinchenzo.939,

    Citation Envoyé par Vinchenzo.939 Voir le message
    Si tu veux passer toute ton appli en fr-FR :
    -Attaque ton fichier host (la page aspx qui heberge ton xap)
    -ligne 67&68 (culture et uiculture)
    -modifie le code par value="fr-FR"
    Je vois pas ou les placer dans mon fichier asp, la ligne 67 ne correspond pas à la culture :
    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
    <%@ Page Language="C#" AutoEventWireup="true" %>
     
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>POC_AutoXamlPegaz</title>
        <style type="text/css">
        html, body {
    	    height: 100%;
    	    overflow: auto;
        }
        body {
    	    padding: 0;
    	    margin: 0;
        }
        #silverlightControlHost {
    	    height: 100%;
    	    text-align:center;
        }
        </style>
        <script type="text/javascript" src="Silverlight.js"></script>
        <script type="text/javascript">
            function onSilverlightError(sender, args) {
                var appSource = "";
                if (sender != null && sender != 0) {
                  appSource = sender.getHost().Source;
                }
     
                var errorType = args.ErrorType;
                var iErrorCode = args.ErrorCode;
     
                if (errorType == "ImageError" || errorType == "MediaError") {
                  return;
                }
     
                var errMsg = "Unhandled Error in Silverlight Application " +  appSource + "\n" ;
     
                errMsg += "Code: "+ iErrorCode + "    \n";
                errMsg += "Category: " + errorType + "       \n";
                errMsg += "Message: " + args.ErrorMessage + "     \n";
     
                if (errorType == "ParserError") {
                    errMsg += "File: " + args.xamlFile + "     \n";
                    errMsg += "Line: " + args.lineNumber + "     \n";
                    errMsg += "Position: " + args.charPosition + "     \n";
                }
                else if (errorType == "RuntimeError") {           
                    if (args.lineNumber != 0) {
                        errMsg += "Line: " + args.lineNumber + "     \n";
                        errMsg += "Position: " +  args.charPosition + "     \n";
                    }
                    errMsg += "MethodName: " + args.methodName + "     \n";
                }
     
                throw new Error(errMsg);
            }
        </script>
    </head>
    <body>
        <form id="form1" runat="server" style="height:100%">
        <div id="silverlightControlHost">
            <object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%">
    		  <param name="source" value="ClientBin/POC_AutoXamlPegaz.xap"/>
    		  <param name="onError" value="onSilverlightError" />
    		  <param name="background" value="white" />
    		  <param name="minRuntimeVersion" value="3.0.40818.0" />
    		  <param name="autoUpgrade" value="true" />
    		  <a href="http://go.microsoft.com/fwlink/?LinkID=149156&v=3.0.40818.0" style="text-decoration:none">
     			  <img src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Get Microsoft Silverlight" style="border-style:none"/>
    		  </a>
    	    </object><iframe id="_sl_historyFrame" style="visibility:hidden;height:0px;width:0px;border:0px"></iframe></div>
        </form>
    </body>
    </html>

    Citation Envoyé par Vinchenzo.939 Voir le message
    Tu peux faire encore plus propre :
    -Attaque ton fichier app.xaml.cs (c'est ton application Silverlight)
    -Dans le constructeur (app()) ajoute
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR")
    Thread.CurrentThread.CurrentUICulture = new CultureInfo("fr-FR")
    Ca je l'ai déjà essayé (ma 2ème réponse dans la discu ^^), sans succès!

    Merci quand même!

  14. #14
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2011
    Messages : 82
    Par défaut
    Au temps pour moi,
    je pensais que c'etait d'origine dans les aspx.
    Voila les 2 lignes en question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <param name="uiculture" value="<%= System.Threading.Thread.CurrentThread.CurrentUICulture %>" />
    <param name="culture" value="<%= System.Threading.Thread.CurrentThread.CurrentCulture %>" />
    En virant le code behind (<% %> ) et en mettant "fr-FR" ca passes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <param name="uiculture" value="fr-FR" />
    <param name="culture" value="fr-FR" />
    Pour la modif de app.xaml.cs, tu ajoutes les 2 lignes avant ou apres le InitializeComponment ?
    Il faut les mettres avant car c'est le init qui creer le bind avec ta page aspx pour les cultures.

  15. #15
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Avril 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2010
    Messages : 152
    Par défaut
    J'étais pas sur d'avoir mis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR");
                Thread.CurrentThread.CurrentUICulture = new CultureInfo("fr-FR");
    avant le InitializeComponent(), alors j'ai testé, mais ça ne marche toujours pas :
    (en debug, résultats des watch)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    this.objSite.RSIT_DATE_MISE_EN_SERVICE_SITE_DT_______________________ {08/12/2011 23:00:00}
    this.objSite.RSIT_DATE_MISE_EN_SERVICE_SITE_DT.Value.ToLocalTime()______ {09/12/2011 00:00:00}
    Je finirai par laisser tomber :S

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

Discussions similaires

  1. Problème Conversion type date
    Par vinch999 dans le forum Requêtes
    Réponses: 3
    Dernier message: 30/06/2014, 11h57
  2. problème conversion date en chaîne
    Par fakhita dans le forum Langage
    Réponses: 6
    Dernier message: 12/07/2007, 14h16
  3. [T-SQL] Problème de conversions de dates
    Par kooljy dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 08/06/2006, 14h19
  4. - [CAST ou CONVERT] Problème de conversion de date
    Par Boublou dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 06/07/2004, 14h31
  5. Problème conversion date
    Par mat.M dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 30/03/2004, 15h05

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