【问题标题】:Issue with dates in WCF service and in JavaSerializer decoderWCF 服务和 JavaSerializer 解码器中的日期问题
【发布时间】:2011-06-07 22:54:43
【问题描述】:

跨时区工作的最讨厌的问题之一 :)

这是我的问题:

  1. 我有通过 JSON 对象将日期传递到 WCF 的代码,我使用“短”格式,其中它只包含自 1970 年以来的毫秒数,没有时区。这个由 WCF 解析的 DateTime 刚刚好

  2. 我将日期存储到 SQL Server 数据库中。示例:2011-06-07 22:17:01.113 - 我在 SQL Server 中看到的日期,这很好,因为我将所有内容都存储在 UTC 中。所以,它的 (-5) 时区和日期看起来是正确的。

  3. 我使用 EF 将日期字段加载到我的对象中,并且内部对象属性说它是 22:17 并且 Kind=Unspecified 再次可以,它是从 SQL 加载的,我知道它是 UTC 但代码不是知道这一点,因此它将这个日期加载为未指定。

  4. 我将此对象返回给 WCF 客户端。它可以是 XML,也可以是 JSON。这就是发生的事情。当我使用 JSON(这是客户端指定的)时 - 我得到这个:日期为 1307503021113-0500。如果我们使用 SQL 将第一部分转换为 DateTime:

选择日期添加(ss,1307503021, '1970-01-01')

2011-06-08 03:17:01.000

上面的部分已经错了,不是吗?如果我们应用 -5hr 调整,我们将回到 22:17 pm,这已经是 UTC 时间了?这部分已经让我感到困惑。但更糟糕的是 - 当我使用 JavaScriptSerializer 反序列化时 - 我在新膨胀的对象中看到 DateTime 值,显示 UTC 类型和凌晨 3:17

var oSerializer = new JavaScriptSerializer();
                var returnValue = (T)oSerializer.Deserialize(s, typeof(T));

我已经很困惑了,我想知道是否可以强制 WCF 和其他序列化器/反序列化器不做任何时间偏移和东西?我宁愿手动格式化所有日期以供显示,我想将 UTC 日期存储在数据库中。

更新:

看起来 WCF 认为如果 DateKind 未指定而不是 LOCAL。 我这样做了:从 EF 获取对象后,我指定了 Kind:

foreach (var tu in tripUpdates)
                {
                    tu.DeviceTime = DateTime.SpecifyKind(tu.DeviceTime, DateTimeKind.Utc);
                }

修复了它 - 现在当 WCF 提供对象时,它不包括很棒的时区。现在我的主要问题是有什么方法可以以某种方式在 EF 实体上指定种类,这样我就不必为服务中的每个日期手动指定种类?

【问题讨论】:

    标签: c# wcf datetime json


    【解决方案1】:

    当您通过 SELECT 语句获取日期时间时,请始终将 DateTime.Kind 设置为 UTC。这样 WCF/XML 就不会尝试调整时间了。

    【讨论】:

    • 查看我的更新。我做到了。现在我想知道如何自动处理这个:)
    • 也许这是另一个问题?
    • @katit 你能问这个问题吗? :)
    • @wal - 我已经用谷歌搜索了 - 看起来在 EF 中没有办法做到这一点。一种选择是移至 DateTimeOffset ,但这比它的价值更麻烦。我有自己的用于 JSON 的手写类 - 我只是在其中放置代码以指定 Kind 并完成它..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-30
    • 2016-11-29
    • 1970-01-01
    相关资源
    最近更新 更多