gpt4 book ai didi

c# - WCF 服务和 JavaSerializer 解码器中的日期问题

转载 作者:太空宇宙 更新时间:2023-11-03 11:36:05 24 4
gpt4 key购买 nike

跨时区工作最棘手的问题之一:)

这是我的问题:

  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:

SELECT DATEADD(ss, 1307503021, '1970-01-01')

2011-06-08 03:17:01.000

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

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

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

更新:

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

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

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

最佳答案

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

关于c# - WCF 服务和 JavaSerializer 解码器中的日期问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6272520/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com