2016-09-12 1 views
0

У меня есть клиентское приложение, которое отправляет даты по местному времени в Rest Api. Пример дата:Как сделать перевод с локального на UTC пользователя Json?

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

Остальное Api тогда необходимо направить эти даты МОВ к службе SOAP, например:

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

Я использую следующий конвертер для преобразования значений даты из по местному времени по Гринвичу:

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))); 
    } 
} 

выше преобразователь размещен в качестве атрибута на всех DateTime свойств классов POCO. Эти классы используются как клиентским приложением, так и Rest Api.

Однако конвертер не преобразуется из локальной в Utc.

Что мне не хватает?

+0

Вы не можете преобразовать * в * Json - это только формат контейнера и не делает * активно * что-то. Вам нужно конвертировать либо на сервер, либо на внешнюю сторону. – Robert

+0

Я не использовал его, но мое чтение документов заключается в том, что 'DateTime.SpecifyKind ((DateTime) value, DateTimeKind.Utc))' означает, что вы объявляете, что 'value' находится в UTC (даже если это isn ' т). Поэтому, когда вы запускаете 'ToUniversalTime' на это значение, он думает, что он уже в UTC и не конвертирует его. Это мое предположение. Если я прав, вам нужно указать часовой пояс, что 'значение' фактически _is_ – ADyson

ответ

0

Поскольку преобразование должно иметь место только на сервере, сериализации от клиента к серверу было сделано следующим образом, используя один из методов перегрузки, которая требует одного или нескольких преобразователей:

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

При десериализации из мыла сервис на сервере, то же самое относится:

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

следующее изменение было сделано в пользовательском преобразователе:

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)); 
     } 
    } 

Кроме того, все атрибуты были удалены из всех объектов DateTime.