如何在Json中从本地转换为UTC?

时间:2016-09-12 08:26:15

标签: c# json json.net

我有一个客户端应用程序,可以在当地时间向Rest Api发送日期。一个示例日期是:

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

然后,Rest Api需要将这些日期在Utc中转发到SOAP服务,例如:

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

我使用以下转换器将日期值从本地时间转换为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)));
    }
}

上述转换器作为属性放置在POCO类的所有DateTime属性上。这些类由客户端应用程序和Rest Api使用。

但是,转换器没有从本地转换为Utc。

我错过了什么?

1 个答案:

答案 0 :(得分:0)

由于转换只应在服务器中进行,所以从客户端到服务器的序列化如下所示,使用一种需要一个或多个转换器的重载方法:

b

从soap服务反序列化到服务器时,同样适用:

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)); } } 属性中删除。