2017-07-20 3 views
3

Ich habe folgendes ProblemRestSharp konvertiert Datumsangaben in UTC

Ich benutze RestSharp für den Zugriff auf meine API. Aber wenn ich eine DateTime sende, scheint es in UTC konvertiert zu werden. Ich sende '10 .06.1991 00:00 'und die API bekommt '09 .06.1991 22:00'

Also, ich würde immer 2 Stunden hinzufügen müssen, wenn meine API ein DateTime-Objekt bekommt?

Ich überprüft die JSON RestSharp sendet an die API.

public class Test 
{ 
    public int IntProperty {get;set;} 
    public string StringProperty {get;set;} 
    public DateTime DateTimeProperty {get;set;} 
} 

Mein Ziel ist

Test t = new Test{ IntProperty=3, StringProperty="string", DateTimeProperty=new DateTime(1991,06,10) } 

wenn ich das Objekt über RestSharp bin das Senden, das JSON meine API erhält

ist
{ 
    "IntProperty":3, 
    "StringProperty":"string", 
    "DateTimeProperty":"09.06.1991 22:00:00" 
} 

Jede Idee, was ich tun könnte? Danke

+0

Ist das das gleiche Problem wie https://github.com/restharp/RestSharp/issues/691? – mjwills

Antwort

2

Es ist nicht Ihre API, die falsche Daten empfängt, es ist Ihr Client, der "falsche" Daten sendet. Ich habe das gleiche Problem mit meiner API. Nein, es sind korrekte Daten, aber konvertiert in UTC.

Das genaue Problem ist hier beschrieben: https://github.com/restsharp/RestSharp/issues/834

Also, fügen Sie nicht 2 Stunden jeden Datetime Sie es in Ihrem API erhalten. Sie würden vielleicht die korrekten Daten ändern, wenn ein anderer Client nicht konvertierte Daten sendet.

  1. Sie könnten überprüfen, ob Sie bei GET das richtige Datum erhalten. Vielleicht konvertiert RestSharp diese "falsche" Datetime zurück in 10.06.1991 00:00 - vielleicht sind Sie damit einverstanden
  2. Wenn Sie möchten, dass die Datenbank nicht UTC enthält, sondern die Daten, die Sie ursprünglich senden wollten, verwenden Sie nicht den Standard-Serializer, verwenden Sie JSON .Net (http://www.newtonsoft.com/json). Es wird nicht in UTC konvertiert und sendet die ursprüngliche DateTime.

Dies ist ein wirklich gutes Beispiel dafür, wie zu implementieren: http://bytefish.de/blog/restsharp_custom_json_serializer/

  • Sie eine eigene Klasse schreiben, die
  • in serialize ISerializer und IDeserializer

  • implementiert rufen Sie JSON.Net Serialize während in deserialize Sie rufe JSON an.Net Deserialize

  • Sie müssen nur einen Handler zu Ihrem RestClient wie folgt hinzufügen: (Ich bin die statische Standard-Instanz unter Verwendung der in dem erwähnten Blog beschrieben)

mein Kunde wie folgt aussieht:

private readonly RestClient _client; 

public RestApiClient(string apiAdress) 
{ 
    _client = new RestClient(apiAdress); 
    _client.AddHandler("application/json", NewtonsoftJsonSerializer.Default); 
} 

und Anfragen können Sie einstellen, die JsonSerializer:

IRestRequest restRequest = 
     new RestRequest(request.GetRestfulUrl(), request.Method) { 
      RequestFormat = request.DataFormat, 
      JsonSerializer = NewtonsoftJsonSerializer.Default 
     }; 
+0

Welche Variable ist 'Anfrage'? –

+0

Es ist nur ein Objekt, das den Pfad und andere Informationen zum Anfordern der API enthält. Nichts Besonderes. Wichtig ist nur, den 'JsonSerializer' auf den zu setzen, der Json.Net benutzt. –

1

Ich denke, es ist, weil Ihre DateTime Objekte haben DateTime.Kind Eigenschaft entspricht DateTimeKind.Unspecified - es bricht alle Konvertierungen zwischen lokalen und utc Arten. Ich meine, ein Tool geht davon aus, dass Ihre DateTime in Utc ist, wenn es nicht wirklich ist.

Also kämpfen Sie nicht mit den Tools, die die richtige Art Ihrer DateTimes in der Mitte zwischen Ihnen und Ihrem Kunden erraten müssen. Verwenden Sie einfach überall UTC und konvertieren Sie sie nur in lokale, um sie dem Benutzer anzuzeigen.

Oder noch besser, verwenden DateTimeOffset die besser geeignet ist, mit Mehrzonen-mal zu tun .. oder auch Jon Skeet NodaTime Bibliothek benutzen, die für jede zeitbezogene Arbeit ein Schweizer Messer ist (obwohl, vielleicht ist es ein Overkill für Ihren Fall ist).

UPD. Um die Frage von @Matthias Burger in den Kommentaren zu beantworten:

Wie würden Sie mit Daten wie Geburtsdatum arbeiten? Ich denke, "10.06.1991" könnte ein Geburtstag sein. Bedeutet, in UTC war sein Geburtstag anders als GMT - oder?

Wie immer - es hängt :)

Im Laufe der Zeit ist eine heikle Sache, sollten Sie vorsichtig sein - und es ist ein großer Artikel aus dem Blog Jon Skeet über joys of date/time arithmetic. Ich weiß, es ist keine echte Antwort, ehrlich gesagt, aber es gibt zu viele verschiedene Problemfälle - müssen wir Daten vergleichen, sind sie im selben Kalender, nehmen wir an, dass alle Menschen um Mitternacht in der lokalen Zeitzone geboren wurden und etc.

In bereits erwähnten NodaTime gibt es ein Konzept der globalen und lokalen Augenblicke (siehe concepts page). Ich denke für die einfachsten Fälle, wenn wir nur Geburtstage speichern und zeigen müssen LocalDate (lokales Datum) ist genug. Sogar DateTime reicht aus, wenn Sie das lokale Datum speichern und die gleiche Zeitzone für alle festlegen (so wird es sein, dass Sie die Zeitzone überhaupt nicht verwenden).

P.S. BTW, weiß nicht, ob die letzte Frage ein Scheck war oder nicht, aber UTC is a standard and GMT is a time zone;)

+0

Nur für mein Interesse und besseres Verständnis: Wie würdest du mit Daten wie Geburtsdatum arbeiten? Ich denke, "10.06.1991" könnte ein Geburtstag sein. Bedeutet, in UTC war sein Geburtstag anders als GMT - oder? –

+1

@MatthiasBurger aktualisierte meine Antwort) – pkuderov

Verwandte Themen