跨时区的最棘手的问题之一:)
这是我的问题:
我有通过JSON对象将日期传递到WCF的代码,我使用“短”格式,其中自1970年以来它只包含毫秒,没有时区。这个由WCF解析的DateTime只是FINE
我将日期存储到SQL Server数据库中。示例:2011-06-07 22:17:01.113 - 我在SQL Server中看到它的日期,这很好,因为我将所有内容都存储在UTC中。所以,它的(-5)时区和日期看起来正确。
我使用EF将日期字段加载到我的对象中,并且内部对象属性表示它是22:17并且Kind =未指定再次正常,它是从SQL加载的,我知道它是UTC但是代码没有知道所以它将此日期加载为未指定。
我将此对象返回给WCF客户端。它可以是XML,也可以是JSON。这是发生的事情。当我JSON(这是客户指定的) - 我得到这个:1307503021113-0500的日期。如果我们使用SQL将第一部分转换为DateTime:
SELECT DATEADD(ss,1307503021, '1970-01-01')
2011-06-08 03:17:01.000
以上部分已经错了,不是吗?如果我们应用-5小时调整,我们将回到22:17 pm已经有时间了吗?这部分已经让我困惑了。但更糟糕的是 - 当我使用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服务对象时,它不包括GREAT的时区。现在我的主要问题是有什么办法在某种程度上指定EF实体上的Kind,所以我不必为服务中的每个日期手动指定种类?
答案 0 :(得分:2)
当您通过SELECT语句获取日期时间时,始终将DateTime.Kind设置为UTC。这样WCF / XML就不会尝试调整时间。