Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WCF服务和JavaSerializer解码器中的日期问题_C#_Wcf_Datetime_Json - Fatal编程技术网

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

C# WCF服务和JavaSerializer解码器中的日期问题,c#,wcf,datetime,json,C#,Wcf,Datetime,Json,跨时区工作最糟糕的问题之一:) 我的问题是: 我的代码通过JSON对象将日期传递到WCF,我使用“short”格式,其中自1970年以来只包含毫秒,没有时区。这个日期时间被WCF解析得很好 我将日期存储到SQL Server数据库中。示例:2011-06-07 22:17:01.113-我在SQL Server中看到的日期,这非常好,因为我将所有内容都存储在UTC中。所以,这是(-5)个时区,日期看起来是对的 我使用EF将日期字段加载到我的对象中,对象的内部属性表示它是22:17,并且Kind=

跨时区工作最糟糕的问题之一:)

我的问题是:

  • 我的代码通过JSON对象将日期传递到WCF,我使用“short”格式,其中自1970年以来只包含毫秒,没有时区。这个日期时间被WCF解析得很好

  • 我将日期存储到SQL Server数据库中。示例:2011-06-07 22:17:01.113-我在SQL Server中看到的日期,这非常好,因为我将所有内容都存储在UTC中。所以,这是(-5)个时区,日期看起来是对的

  • 我使用EF将日期字段加载到我的对象中,对象的内部属性表示它是22:17,并且Kind=Unspecified,这也是可以的,它是从SQL加载的,我知道它是UTC,但代码不知道,所以它将此日期加载为Unspecified

  • 我将此对象返回到WCF客户端。它可以是XML,也可以是JSON。下面是发生的情况。当我输入JSON(这是客户机指定的内容)时,我得到的是:1307503021113-0500作为日期。如果我们使用SQL将第一部分转换为DateTime:

  • 选择日期添加(ss,1307503021, ‘1970-01-01’)

    2011-06-08 03:17:01.000

    上面的部分已经错了,不是吗?如果我们应用-5小时调整,我们将返回到utc时间晚上22:17?这部分我已经搞糊涂了。但更糟糕的是——当我使用JavaScriptSerializer进行反序列化时——我在新膨胀的对象中看到了日期时间值,表示UTC种类和3:17am

    var oSerializer = new JavaScriptSerializer();
                    var returnValue = (T)oSerializer.Deserialize(s, typeof(T));
    
    我已经很困惑了,我想知道是否有可能强制WCF和其他序列化程序/反序列化程序不执行任何时间偏移和其他操作?我希望手动设置所有日期的格式,并将UTC日期存储在数据库中

    更新:

    看起来WCF认为如果DateKind未指定,那么它是本地的。 我这样做了:从EF获得对象后,我指定了一种:

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

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

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

    请参阅我的更新。是的。现在我想知道如何神奇地处理这台自动变速器:)也许这是另一个问题?@katit你能问这个问题吗?:)@沃尔-我已经在谷歌上搜索过了-看起来在EF中没有办法做到这一点。一种选择是移动到DateTimeOffset,但这比它的价值更麻烦。我有自己的手工编写的JSON类,我只是把代码放在那里指定种类,并将使用它完成。。