2008-11-03 15 views
5

Mamy uruchomioną aplikację szeregującą, która wywołuje usługę WCF do uruchamiania nocnych zadań. Wiele z nich zawiera informacje o aktualnej dacie biznesowej. Ze względów biznesowych serwer planowania jest ustawiony na GMT, ale nasza usługa działa na serwerach ustawionych na NY time.Obsługa deserializacji WCF obiektów DateTime

To powoduje problem; daty są przekazywane do naszej usługi .NET z wyraźnymi informacjami o strefie czasowej. Kiedy usługa informuje aplikację o terminie "2008-11-03 00:00:00 +0: 00", usługa interpretuje to jako "2008-11-02 19:00:00 -5: 00 "i rzeczy biegają z niewłaściwą datą.

Zachowanie harmonogramu jest niezależne i zakodowane na stałe, więc nie możemy poinformować harmonogramu o pominięciu przesunięcia strefy czasowej. Nie chcemy zawsze konwertować daty na GMT, ponieważ istnieje realna możliwość, że nasze azjatyckie biura wezmą tę samą usługę, a my wrócimy do tego samego problemu.

Czy istnieje sposób oznaczenia DataContract, a nawet kontrolowania go na wystarczająco niskim poziomie, aby upewnić się, że typ DateTime będzie nieokreślony? A może jest jakiś sposób z DateTime, aby określić, jakie były pierwotne informacje użyte do jego utworzenia i przekonwertować je z powrotem do pierwotnej wartości w etapie przetwarzania końcowego?

Jeśli to pomaga, w tej chwili nasza umowa jest dość prosta. Metody przyjmują jeden parametr, który jest klasą pochodną klasy poniżej.

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

Jeśli chcesz ustawić serwer planowania na GMT, ustaw strefę czasową systemu operacyjnego na GMT. –

Odpowiedz

3

Jeśli rozumiem problem prawidłowo, można rozwiązać ten problem w przetwarzaniu postu po prostu za pomocą DateTime.ToUniversalTime() na stronie serwisu. Dla Twojego przykładu powinno to dać Ci DateTime z wartością "2008-11-03 00:00:00" i Kind = DateTimeKind.Utc. Teraz, jeśli potrzebujesz tej samej wartości, ale jako Lokalny lub Nieokreślony, możesz użyć parametru DateTime.SpecifyKind(DateTime, DateTimeKind), aby ustawić Kind bez zmiany wartości.

+0

Tak ... zachowaj to, co usługa zwraca jako UTC, pozostaw to klientom do konwersji lub interpretacji. –

Powiązane problemy