如何处理从WCF数据服务(OData)返回的json DateTime

And*_*May 20 wcf json wcf-data-services odata

我相信我在这里遗漏了一些明显的东西.当我从OData服务请求JSON响应时,我得到的DateTime属性的结果与我请求XML时的结果不同.我将使用NerdDinner OData feed作为示例.

JSON:

http://www.nerddinner.com/Services/OData.svc/Dinners(1)?$format=json
"EventDate": "\/Date(1235764800000)\/"
Run Code Online (Sandbox Code Playgroud)

XML:

http://www.nerddinner.com/Services/OData.svc/Dinners(1)
<d:EventDate m:type="Edm.DateTime">2009-02-27T20:00:00</d:EventDate>
Run Code Online (Sandbox Code Playgroud)

当我做警报(新日期(1235764800000))时,我得到这个结果: 替代文字

当我使用LINQPad运行相同的查询时,我也得到了8PM的结果.为什么JSON结果中的时区不正确?似乎假设响应是GMT.我应该在客户端上处理这个(通过javascript)还是我可以在服务器上设置的东西?

我在客户端上使用jQuery,在服务器上使用WCF数据服务(和实体框架).

更新:

我在客户端使用Datejs来处理UTC日期时间格式.我想知道这是否是解决这个问题的正确方法.

 function getDateString(jsonDate) {
     if (jsonDate == undefined) {
         return "";
     }
     var utcTime = parseInt(jsonDate.substr(6));

     var date = new Date(utcTime);
     var minutesOffset = date.getTimezoneOffset();

     return date.addMinutes(minutesOffset).toString("M/d/yyyy h:mm tt");
 }
Run Code Online (Sandbox Code Playgroud)

Bry*_*yan 19

根据这个msdn链接,DateTime对象是......

...在JSON中表示为"/ Date(刻度数)/".刻度数是一个正或负的长值,表示自UTC时间1970年1月1日午夜以来经过的刻度数(毫秒).

所以你认为.NET是正确的,但它是UTC而不是GMT(尽管它们是相似的).这里有一些 很好的 答案可以提供更多细节,并提供将JSON解析为客户端上可用日期的方法.

至于将日期从UTC转换为特定时区,在服务器上您可以使用TimeZoneInfo具有ConvertTimeFromUtc方法的类.或者您可以编写一个继承自JavaScriptConverter该类的自定义转换器.在javascript中,有可以使用的方法UTCgetTimezoneOffset方法.

希望这会有所帮助,祝你好运.


小智 7

如果这可能有所帮助,我面临同样的问题,我结束了实现这样的事情,不是那么优雅,但它的工作原理.

String.prototype.DateWCF = function(dateformat) {
    return new Date(parseInt(this.match(/\/Date\(([0-9]+)(?:.*)\)\//)[1])).format(dateformat);
};
Run Code Online (Sandbox Code Playgroud)

然后$.ajax成功:

        success: function(data) {
            $.each(data, function() {
                var hello = this.DateTimeProperty.DateWCF('dd-MM-yyyy'));
            });
        }
Run Code Online (Sandbox Code Playgroud)

我希望这可能会有所帮助.


d1j*_*i1b 5

这应该可以正常工作:

var date = new Date(parseInt(jsonDate.substr(6)));
Run Code Online (Sandbox Code Playgroud)

substr函数取出“ / Date(”部分,而parseInt函数获取整数,并在末尾忽略“)/”。

对于ISO-8601格式的JSON日期,只需将字符串传递给Date构造函数即可:

var date = new Date(jsonDate); //no ugly parsing needed; full timezone support
Run Code Online (Sandbox Code Playgroud)

该问题已得到修复,并讨论了有关此先前文章的内容


归档时间:

查看次数:

39492 次

最近记录:

9 年,10 月 前