1

我有一个使用以下序列化代码的 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) 代码返回一个包含可为空的日期时间的类的实例。

问题是在序列化/反序列化过程中,日期会损失一个小时,我认为这是某种 UTC 偏移量。这有点烦人,因为无论如何我只想要日期部分,所以看起来所有日期都是前一天。

我已经看到很多关于在 javascript 中修复 tis 的帖子,但是当我的代码的两个部分都使用“标准”序列激光器时,我不确定如何应用它们。

4

1 回答 1

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);
        }
    }
于 2012-05-08T21:47:27.807 回答