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

C# Discussion :

Probleme de serialisation de date


Sujet :

C#

  1. #1
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    octobre 2007
    Messages
    4 412
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : octobre 2007
    Messages : 4 412
    Points : 2 494
    Points
    2 494
    Par défaut Probleme de serialisation de date
    Hello,

    Guru needed !

    Voici un tres intéressant problème de serialisation de date

    J'ai une classe qui contient une date
    Cette date est assignée a DateTime now sur un device mobile
    Je transfere la classe a un web service

    Si je transfere la classe directement apres assignation de la date, le web service reçoit une date décalée de 6 heure
    Si par contre j'écris la date dans un fichier avec un bete tostring() et que ensuite je recrer une classe en relisant la date ecrite dans le fichier et que je la transfere au web service, elle aura la bonne valeur !!!

    Une idée ??

    Merci.
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  2. #2
    Membre éclairé Avatar de PatteDePoule
    Homme Profil pro
    Développeur .NET
    Inscrit en
    août 2008
    Messages
    380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : août 2008
    Messages : 380
    Points : 763
    Points
    763
    Par défaut
    DateTime.Now semble prendre en compte le fuseau horaire. Je regarderais à ce niveau là.
    Les fautes d'orthographes sus-citées sont déposées auprès de leurs propriétaires respectifs. Aucune responsabilité n'est engagée sur la lisibilité du message ou les éventuels dommages qu'il peut engendrer.

  3. #3
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    octobre 2007
    Messages
    4 412
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : octobre 2007
    Messages : 4 412
    Points : 2 494
    Points
    2 494
    Par défaut
    Merci PatteDePoule

    Oui je pense que tu a raison mais c'est quand meme vraiment strange
    Car en résumé voici le constat

    Test 1
    1- J'assigne un Datetime a DateTime.Now; : 2011-03-30 17:15 PM
    2- Je transfere ce datetime vers le serveur (donc serialisation automatique)
    3- Le serveur reçois la date : 2011-03-30 23:15 PM

    Test 2
    1- J'assigne un Datetime a DateTime.Now; : 2011-03-30 17:15 PM
    2- J'ecris datetime dans un fichier texte sw.WriteLine("{0}",MonDateTime);
    3- Je controle le resultat : l'heure est bonne (je n'ai plus le format exact sous les yeux)
    4- Je relis ce fichier : MonDateTime=DateTime.Parse(DateSauve);
    5- Je transfere
    6- la date recue est bonne

    Donc il faut conclure que le mecanisme d'ecriture et de relecture modifie certains attributs du DateTime

    Etant ern Belgique, cela signifie accessoirement que selon l'operation, le device peut se voir soit un GMT+1 soit en GMT+6

    Une solution envisageable serait evidement de passer systematiquement par un preformatage en string du DateTime.now

    Mais j'aimerais savoir s'il n'y a pas de solution plus robuste
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  4. #4
    Membre éclairé Avatar de PatteDePoule
    Homme Profil pro
    Développeur .NET
    Inscrit en
    août 2008
    Messages
    380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : août 2008
    Messages : 380
    Points : 763
    Points
    763
    Par défaut
    Il faudrait peut-être que tu fonctionnes avec DateTime.UtcNow à la place?
    Les fautes d'orthographes sus-citées sont déposées auprès de leurs propriétaires respectifs. Aucune responsabilité n'est engagée sur la lisibilité du message ou les éventuels dommages qu'il peut engendrer.

  5. #5
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    octobre 2007
    Messages
    4 412
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : octobre 2007
    Messages : 4 412
    Points : 2 494
    Points
    2 494
    Par défaut
    Merci patte de poule

    Je vais investiguer de ce coté
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  6. #6
    Membre expérimenté Avatar de Arthis
    Profil pro
    Inscrit en
    octobre 2003
    Messages
    1 265
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Italie

    Informations forums :
    Inscription : octobre 2003
    Messages : 1 265
    Points : 1 352
    Points
    1 352
    Par défaut
    Cela pourrait etre un probleme de culture du thread. Celui ci pourrait etre basé sur en-US par exemple et par la meme transformer ta date en UTC avec 6 heures de decalage pour atteindre l'utc.

  7. #7
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : janvier 2007
    Messages : 6 604
    Points : 13 219
    Points
    13 219
    Par défaut
    Citation Envoyé par Arthis Voir le message
    Cela pourrait etre un probleme de culture du thread. Celui ci pourrait etre basé sur en-US par exemple et par la meme transformer ta date en UTC avec 6 heures de decalage pour atteindre l'utc.
    Non.
    Le décalage horaire n'est pas une propriété de la cullture. On ne voit pas comment il pourrait l'être d'ailleurs, car cela supposerait une association culture-lieu géographique qui serait souvent dénuée de sens.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  8. #8
    Membre expérimenté Avatar de Arthis
    Profil pro
    Inscrit en
    octobre 2003
    Messages
    1 265
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Italie

    Informations forums :
    Inscription : octobre 2003
    Messages : 1 265
    Points : 1 352
    Points
    1 352
    Par défaut
    autant pour moi. Merci du correctif.

    Apres un peu de recherche il semblerait que ce ne soit pas culture comme je le pensais mais timezone qui est responsable de la gestion decalage horaire par rapport a l'UTC et que cette valeur serait liee a la machine pas au thread.

    BlueDeep a entierement raison quant a utiliser seulement l'UTC. Beaucoup plus simple.

  9. #9
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : janvier 2007
    Messages : 6 604
    Points : 13 219
    Points
    13 219
    Par défaut
    Citation Envoyé par olibara Voir le message
    Une solution envisageable serait evidement de passer systematiquement par un preformatage en string du DateTime.now
    Je ne vois pas en quoi formatter en string le DateTime serait une solution.
    Le mieux est de faire tout en UTC, puis ensuite d'afficher en fonction diu DateTimeOffset coté client et coté serveur. (la propriété OffSet du DateTimeOffset est un TimeSpan qui contient le décalage avec l'UTC).

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  10. #10
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    octobre 2007
    Messages
    4 412
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : octobre 2007
    Messages : 4 412
    Points : 2 494
    Points
    2 494
    Par défaut
    Citation Envoyé par BlueDeep
    Je ne vois pas en quoi formatter en string le DateTime serait une solution.
    Ce que j'ai découvert rejois sans doute l'hypothese de Arthis

    1- Le DateTime sur le device vaut 17h40
    2- Ce dateTime transferé sur le serveur vaut 23h40
    3- Par contre ce datetime passé par un string et ensuite par un DateTime.Parse et ensuite transféré au serveur vaut bien 17h40

    Je soupconne donc que le DateTime.Now assigné a la base contienne une information de culture ou de localisation qui est utilisé dans la sérialisation WSDL
    Par contre un DateTime.parse donne sans doute une valeur nulle de culture ou de localization et la sérialization utilise la valeur Verbatim (spéculation sur base du constat)
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  11. #11
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : janvier 2007
    Messages : 6 604
    Points : 13 219
    Points
    13 219
    Par défaut
    Citation Envoyé par olibara Voir le message
    Je soupconne donc que le DateTime.Now assigné a la base contienne une information de culture ou de localisation qui est utilisé dans la sérialisation WSDL
    Par contre un DateTime.parse donne sans doute une valeur nulle de culture ou de localization et la sérialization utilise la valeur Verbatim (spéculation sur base du constat)
    Tu devrais relire ma réponse et pas seulement la première ligne.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  12. #12
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : octobre 2008
    Messages : 3 615
    Points : 8 054
    Points
    8 054
    Par défaut
    Il faut observer la propriété Kind du DateTime. Elle est soit Local, soit Utc, soit undefined.

    Cf cet 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
    16
    17
    18
    19
    var a = DateTime.Now.Dump();
    a.Kind.Dump();
    a.ToUniversalTime().Dump();
    a.ToLocalTime().Dump();
    "---".Dump();
    var b = DateTime.UtcNow.Dump();
    b.Kind.Dump();
    b.ToUniversalTime().Dump();
    b.ToLocalTime().Dump();
    "---".Dump();
    var c = DateTime.Parse(DateTime.Now.ToString()).Dump();
    c.Kind.Dump();
    c.ToUniversalTime().Dump();
    c.ToLocalTime().Dump();
    "---".Dump();
    var d = DateTime.Parse(DateTime.UtcNow.ToString()).Dump();
    d.Kind.Dump();
    d.ToUniversalTime().Dump();
    d.ToLocalTime().Dump();
    qui génére:

    4/3/2012 2:39:30 PM
    Local
    4/3/2012 12:39:30 PM
    4/3/2012 2:39:30 PM


    4/3/2012 12:39:30 PM
    Utc
    4/3/2012 12:39:30 PM
    4/3/2012 2:39:30 PM

    4/3/2012 2:39:30 PM
    Unspecified
    4/3/2012 12:39:30 PM
    4/3/2012 4:39:30 PM

    4/3/2012 12:39:30 PM
    Unspecified
    4/3/2012 10:39:30 AM
    4/3/2012 2:39:30 PM

  13. #13
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    octobre 2007
    Messages
    4 412
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : octobre 2007
    Messages : 4 412
    Points : 2 494
    Points
    2 494
    Par défaut
    Merci a tous

    Bludeep : j'avais bien lu toutes tes lignes mais je repondais a ta question de la premiere ligne

    Citation Envoyé par BlueDeep
    Je ne vois pas en quoi formatter en string le DateTime serait une solution
    Et ce que je soupconnait est clairement démontré par Nathanael : le DateTime.parse déspécifie le Kind et du coup ca permet indirectement de contourner le problème du du client et du serveur qui n'utilisent pas la meme reference

    C'est pas joli j'en convient mais ca explique bien l'effet rencontré !
    Merci et je marque résolu
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

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

Discussions similaires

  1. petit probleme script heure et date
    Par ion dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 08/12/2005, 21h47
  2. requete SQL et probleme de format de Date
    Par huon dans le forum Langage SQL
    Réponses: 3
    Dernier message: 25/08/2005, 12h56
  3. Probleme de conversion de dates
    Par manu00 dans le forum Langage
    Réponses: 4
    Dernier message: 29/05/2005, 01h00
  4. Probleme avec affichage de date
    Par Wongmaster dans le forum Access
    Réponses: 27
    Dernier message: 24/12/2004, 21h51
  5. [VB6] Problème d'addition de dates et de nombres
    Par pepper dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 28/11/2002, 22h12

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