2016-09-12 3 views
0

Ich habe eine Client-App, die Daten in Ortszeit an einen Rest Api sendet. Ein Beispiel Datum ist:Wie konvertiert man innerhalb Json von lokal nach UTC?

"2016-09-12T10:05:44.583694+02:00" 

The Rest Api muss dann diese Daten in Utc an einen SOAP-Dienst zu übermitteln, zum Beispiel:

"2016-09-12T08:05:44Z" 

ich folgenden Konverter bin mit konvertieren Datumswerten aus Ortszeit Utc:

public class UtcDateTimeConverter : IsoDateTimeConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return objectType == typeof(DateTime); 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     if (value == null) 
     { 
      writer.WriteNull(); 
      return; 
     } 

     writer.WriteValue(TimeZone.CurrentTimeZone.ToUniversalTime(DateTime.SpecifyKind((DateTime)value, DateTimeKind.Utc))); 
    } 
} 

der obige Wandler wird als Attribut für alle DateTime Eigenschaften der POCO Klassen platziert. Diese Klassen werden sowohl von der Client-App als auch von Rest Api verwendet.

Der Konverter konvertiert jedoch nicht von lokal zu Utc.

Was fehlt mir?

+0

Sie können nicht konvertieren * innerhalb * Json - es ist nur das Container-Format und nicht aktiv * etwas * tun. Sie müssen entweder auf Server- oder auf Frontend-Seite konvertieren. – Robert

+0

Ich habe es nicht benutzt, aber mein Lesen der Dokumente ist, dass 'DateTime.SpecifyKind ((DateTime) -Wert, DateTimeKind.Utc))' bedeutet, dass Sie erklären, dass 'Wert' ist in UTC-Zeit (auch wenn es nicht ' t). Wenn Sie also 'ToUniversalTime' für diesen Wert ausführen, denkt es, dass es bereits in UTC ist und konvertiert es nicht. Das ist meine Vermutung. Wenn ich richtig bin, müssen Sie die Zeitzone angeben, die 'value' tatsächlich _is_ – ADyson

Antwort

0

die Umwandlung nur in dem Server stattfinden soll, wurde die Serialisierung vom Client zum Server wie folgt durchgeführt von einem der Überlastungs Methoden, die einen oder mehrere Wandler erfordern:

JsonConvert.SerializeObject(request, Formatting.Indented, new UtcDateTimeConverter()) 

Wenn aus Seife Deserialisieren Service-Server, gilt das gleiche:

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     var date = (DateTime)value; 
     if (date.Kind == DateTimeKind.Utc) 
     { 
      writer.WriteValue(TimeZone.CurrentTimeZone.ToLocalTime(date)); 
     } 
     else 
     { 
      writer.WriteValue(TimeZone.CurrentTimeZone.ToUniversalTime(date)); 
     } 
    } 
:

JsonConvert.DeserializeObject<T>(message, new UtcDateTimeConverter()) 

folgende Änderung in dem benutzerdefinierten Konverter getan wurde

Darüber hinaus wurde das gesamte Attribut aus allen DateTime Eigenschaften entfernt.

Verwandte Themen