2008-11-03 13 views
5

Nous avons une application de planification qui appelle un service WCF pour exécuter des tâches nocturnes. Un grand nombre d'entre eux comprennent des informations sur la date d'activité actuelle. Pour des raisons professionnelles, le serveur de planification est défini sur GMT, mais notre service s'exécute sur des serveurs définis sur l'heure de New York.Gestion de la désérialisation des objets DateTime par WCF

Cela pose un problème; les dates sont passées à notre service .NET avec des informations de fuseau horaire explicites. Ainsi, lorsque le service dit à l'application de s'exécuter avec une date de "2008-11-03 00:00:00 +0: 00", le service interprète cela comme "2008-11-02 19:00:00 -5: 00 "et les choses vont avec la mauvaise date. Le comportement du planificateur est codé en dur et de tierce partie, nous ne pouvons donc pas dire au planificateur d'omettre le décalage de fuseau horaire. Nous ne voulons pas toujours convertir la date en heure GMT car il y a une possibilité réelle que nos bureaux asiatiques appellent le même service et nous reviendrons au même problème.

Existe-t-il un moyen de marquer le contrat de données, ou même de le contrôler à un niveau suffisamment bas pour s'assurer que le type DateTime ne sera pas spécifié? Ou existe-t-il un moyen avec un DateTime pour déterminer quelle était l'information originale utilisée pour la créer et la convertir à la valeur d'origine dans une étape de post-traitement?

Si cela vous aide, notre contrat est assez simple. Les méthodes prennent un paramètre qui est une classe dérivée de la classe ci-dessous.

[DataContract] 
public class BaseTimeSensitiveParameters 
{ 
    [DataMember] public DateTime? BusinessDate; 
} 
+0

Si vous souhaitez que le serveur de planification soit défini sur GMT, définissez le fuseau horaire du système d'exploitation sur GMT. –

Répondre

3

Si je comprends bien le problème, vous pouvez résoudre ce en post-traitement en utilisant simplement DateTime.ToUniversalTime() sur le côté service. Pour votre exemple, cela devrait vous donner un DateTime avec la valeur "2008-11-03 00:00:00" et Kind = DateTimeKind.Utc. Maintenant, si vous avez besoin de cette même valeur, mais en tant que Local ou Unspecified, vous pouvez utiliser DateTime.SpecifyKind(DateTime, DateTimeKind) pour définir le Kind sans changer la valeur.

+0

Oui ... gardez ce que le service renvoie comme UTC, laissez-le aux clients pour convertir ou interpréter. –