2012-03-26 7 views
3

Dies ist eine sehr einfache (hoffentlich) Frage. Ich bin neu mit der DateTime-Konvertierung in .NET zu arbeiten.C# UTC DateTime-Abfrage in WCF/.NET

Ich habe einen WCF-Dienst, der eine DateTime-Eigenschaft hat - nennen Sie es BookingDate.

Jemand geht das meinem WCF-Dienst im Format:

<a:BookingDate>2012-03-26T17:03:00-04:00</a:BookingDate> 

Der Server, auf dem sie sitzt eingestellt ist auf eine Zeitzone von UTC (Lissabon, London, Dublin).

Wenn ich den entsprechenden Wert in der Datenbank speichern, wird der Wert zu sein:

2012-03-26 22:03 

Ich nahm an, ich glaube, falsch, dass das .NET Framework (als Teil des WCF serialize/deserialize Prozess) würde für mich in eine .Net für Datum und Uhrzeit von UTC Pop

ich erwarte (wie es der minus von 4 Stunden, wie oben versetzt ist): 2012-03-26 21:03

Meine Frage ist also: ich würde rufen müssen:

var date = fromClientWCFService.BookingDate.ToUniversalTime(); 

um die 21:03 Zeit zu bekommen, die ich erwarte?

Wenn nicht, gibt es eine WCF-Einstellung, um meinem Dienst mitzuteilen, DateTimes in UTC zu konvertieren, anstatt die Server-Zeitzone?

Vielen Dank im Voraus

Mark

EDIT:

Von 1 Antwort, kann ich sehen, dass Datetime verwendet werden kann. Anschluss an diese, würden die folgenden Arbeiten: var offset = DateTimeOffset.Parse("2012-03-26T17:03:00-0400");, um das Ergebnis zurück: 2012-03-26 21:03

+0

Dupe: http://stackoverflow.com/questions/259005/handling-wcf-deserialization-of-datetime-objects – casperOne

+0

Ist das in der Tat ein Betrogener? Wenn es so ist, sollten wir es als solches abschalten. – casperOne

Antwort

3

Anstatt die DateTime structure verwenden, sollten Sie die DateTimeOffset structure verwenden.

Die DateTimeOffset Struktur Captures von einem bestimmten Zeitpunkt der Offset (es ist nicht UTC standardmäßig es durch den Umfang der Ihre Anwendung definiert wird, aber die am häufigsten von UTC Offset wäre) entlang mit dem Datum/Zeit Informationen, und diese Informationen fließen durch WCF-Aufrufe (sowie in eine Datenbank, vorausgesetzt, es unterstützt den Typ. SQL Server hat in diesem Fall die datetimeoffset data type ab 2008).

In der Tat, using DateTimeOffset is the preferred methods of dealing with date/time data in almost all situations. Beachten Sie aus dem vorherigen Link:

Diese Verwendungen für Datetime Werte sind viel häufiger als die für Datetime-Werte. Als Ergebnis sollte DateTimeOffset als der Standarddatums- und Zeittyp für die Anwendungsentwicklung betrachtet werden.

+0

Vielen Dank für Ihre Antwort (besonders schnell). Können Sie meine obigen Ergebnisse bestätigen? Wie in - ich möchte verstehen, ob ich auf der richtigen Linie war, ob ich es so umsetzen wollte? – harrisonmeister

+0

Außerdem kann ich leider nur datetime speichern - sql server 2005 shop ... :( – harrisonmeister

+0

@harrisonmeister Siehe den Link der Betrogenen, die ich auf die Frage geschrieben. – casperOne

0

Wenn die Zeitzone Ihres Servers in Lissabon/London/Dublin liegt, ist es nicht UTC.Sie möchten entweder die Zeitzone Ihres Servers ändern oder den Datums-/Uhrzeitwert im UTC-Formular angeben, wenn Sie ihn in Ihrer Datenbank aktualisieren.

+0

Bedeutet das, dass der WCF-Dienst diese Datumszeit in Ortszeit (z. B. Lissabon/London/Irland) umrechnet? – harrisonmeister

+0

Es gibt wirklich keine "Umwandlung". Ihre DateTime hat a bestimmter Wert, der auf den Daten basiert, die er empfängt. Unglücklicherweise nimmt es auch gerne an, dass das Datum in Ortszeit ist, wenn keine angegeben ist. Da also der Datetime Ihrer DB keine Gebietsschema-Informationen zugeordnet sind, .NET entscheidet, dass es sich um eine lokale, nicht um eine universelle Zeit handelt.Drücken Sie Ihren Wert als UTC (mit .ToUniversalTime) in die DB und konstruieren Sie ihn mit einem DateTimeKind von UTC, das herauskommt Sie die Konsistenz, die Sie suchen. –