两个.net应用程序之间的日期序列化

时间:2012-05-08 10:01:43

标签: .net json serialization nancy

我有一个使用以下序列化代码的Nancy JSON REST服务......

FormatterExtensions.AsJson(this.Response, insightManager.CaseSummary(x.caseId));

然后由...来消毒......

    public static T ParseResponseForObject<T>(string response)
    {
        var javaScriptSerializer = new JavaScriptSerializer();
        try
        {
            return javaScriptSerializer.Deserialize<T>(response);
        }
        catch (Exception ex)
        {
            throw new Exception(response, ex);
        }
    }

insightManager.CaseSummary(x.caseId)代码返回包含可为空的DateTime的类的实例。

问题是在序列化/反序列化过程中,日期会丢失一个小时,我认为这是某种UTC偏移。这有点令人讨厌,因为我只想要日期部分,所以看起来所有日期都是它们真正的前一天。

我已经看到很多帖子在javascript中修复tis但我不确定如何在我的代码的两个部分都使用“标准”serilasers时应用它们。

1 个答案:

答案 0 :(得分:1)

所以,我最终得到了答案。基本上我只需要在反序列化日期之后调用.ToLocalTime()以确保我得到我需要的结果。这里为什么http://www.west-wind.com/weblog/posts/2008/Sep/03/Watch-out-for-Date-Kind-in-JSON-Deserialization

的一个非常好的解释

但是,简而言之,当您序列化为JSON时,日期始终会转换为UTC时间,因此从反序列中返回的日期将始终为UTC日期,因此您需要将其转换回本地时间。

为了防止其他人遇到这个问题,我调整了我的ParseResponseForObject<T>函数,以便始终将本地时间用于任何DateTime或DateTime?...

    public static T ParseResponseForObject<T>(string response)
    {
        var javaScriptSerializer = new JavaScriptSerializer();
        try
        {
            var obj = javaScriptSerializer.Deserialize<T>(response);

            var props = obj
                .GetType()
                .GetProperties(BindingFlags.Instance | BindingFlags.Public);

            foreach (var pi in props)
            {
                if (pi.PropertyType == typeof(DateTime))
                {
                    var origDt = (DateTime)pi.GetValue(obj, null);
                    pi.SetValue(obj, origDt.ToLocalTime(), null);
                }
                else if (pi.PropertyType == typeof(DateTime?))
                {
                    var origDt = (DateTime?)pi.GetValue(obj, null);

                    if (origDt.HasValue)
                    {
                        pi.SetValue(obj, origDt.Value.ToLocalTime(), null);
                    }
                }
            }

            return obj;
        }
        catch (Exception ex)
        {
            throw new Exception(response, ex);
        }
    }