J'ai un service WCF qui reçoit des enregistrements avec des valeurs datetime et les enregistre dans un SQL Azure db, en utilisant Entity Framework 3.5 SP1. Exécuter localement, les enregistrements s'enregistrés dans la base de données, tout est bienWCF to Entity Framework convertit mon datetime en heure locale - comment arrêter?
Cependant, mon hébergement IIS est dans un fuseau horaire différent. Lorsque je télécharge le site là-bas et appelle le même service (avec exactement la même chaîne de connexion, à la base de données Azure SQL), les enregistrements sont toujours enregistrés, mais le temps a reculé de 5 heures.
J'ai vérifié Fiddler, pour regarder les données sortir, et il est à mon heure locale. J'ai utilisé le même service à l'intérieur de l'hébergement Azure, et cela a aussi bien fonctionné. J'ai les mêmes données allant à un autre service WCF sur le même hôte enregistré avec Linq2SQL, et cela économise bien. La seule différence est alors Entity Framework - Je devine que mes informations de fuseau horaire (GMT) sont envoyées avec le datetime, et ainsi quand le serveur dans le temps de Eastern Seaboard le reçoit, il le convertit à l'heure locale, 5 heures plus tôt.
Dans un sens, c'est précis, parce que pour le moment (13:48), il est 5 heures earler - 08:48, mais ce n'est pas ce que je veux enregistrer dans la base de données, je veux enregistrer 13h48. Comme je l'ai demandé, donc il est logique quand je l'interroger
Ceci est probablement très simple, et tout le monde sait la réponse, mais je suis un peu perplexe. J'apprécierais vraiment que quelqu'un puisse me diriger dans la bonne direction.
merci beaucoup
Toby
J'ai une solution de contournement qui semble faire l'affaire -. définir mon datetime original, quand je crée sur le client, comme Utc. Ma classe d'aide sur le serveur le spécifie également comme Utc. De cette façon, la bonne date est enregistrée Cependant, cela pourrait être juste une coïncidence, car GMT est UTC - cela pourrait ne pas fonctionner aussi bien dans 3 mois lorsque nous passerons à l'heure d'été Serait une conversion à "ToLocaltime()" travailler alors? Hmm, dunno idées plus, de prendre le temps d'économiser correctement? – TobyEvans
Non, n'utilisez pas ToLocalTime() ou ToUniversalTime(). Ils appliquent la correction du fuseau horaire en utilisant le fuseau horaire de la machine sur laquelle ils s'exécutent. C'est le problème que vous avez essayé de résoudre, pas répété. Si vous convertissez toujours en UTC, c'est absolu et il ne sera jamais ajusté pour l'heure d'été. Si vous utilisez .NET 3.5 ou version ultérieure, utilisez TimeZoneInfo.ConvertTimeFromUtc() et ConvertTimeToUtc() avec un objet TimeZoneInfo être explicite au sujet de votre conversion. Je les ai utilisés et ils fonctionnent comme prévu. – Suncat2000