【发布时间】:2011-06-07 22:54:43
【问题描述】:
跨时区工作的最讨厌的问题之一 :)
这是我的问题:
我有通过 JSON 对象将日期传递到 WCF 的代码,我使用“短”格式,其中它只包含自 1970 年以来的毫秒数,没有时区。这个由 WCF 解析的 DateTime 刚刚好
我将日期存储到 SQL Server 数据库中。示例:2011-06-07 22:17:01.113 - 我在 SQL Server 中看到的日期,这很好,因为我将所有内容都存储在 UTC 中。所以,它的 (-5) 时区和日期看起来是正确的。
我使用 EF 将日期字段加载到我的对象中,并且内部对象属性说它是 22:17 并且 Kind=Unspecified 再次可以,它是从 SQL 加载的,我知道它是 UTC 但代码不是知道这一点,因此它将这个日期加载为未指定。
我将此对象返回给 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 实体上指定种类,这样我就不必为服务中的每个日期手动指定种类?
【问题讨论】: