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

时间:2010-09-29 04:25:54

标签: 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)\/"

XML:

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

当我发出警报(新日期(1235764800000))时,我得到以下结果: alt text

当我使用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");
 }

8 个答案:

答案 0 :(得分:19)

根据this msdn linkDateTime个对象是......

  

...在JSON中表示为“/ Date(数字   of ticks)/“。滴答数是a   积极或消极的长期价值   表示刻度数   从那以后经过的(毫秒)   1970年1月1日午夜,UTC。

所以你认为.NET是正确的,但它是UTC而不是GMT(尽管they are similar)。这里有some good answers提供了更多详细信息,并提供了将JSON解析为客户端上的可用日期的方法。

就将日期从UTC转换为特定时区而言,您可以在服务器上使用TimeZoneInfoConvertTimeFromUtc方法。或者您可以编写一个继承自JavaScriptConverter类的自定义转换器。在javascript中,可以使用UTCgetTimezoneOffset方法。

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

答案 1 :(得分:7)

如果这可能有所帮助,我遇到了同样的问题,我最终实现了这样的事情,不是那么优雅但是有效。

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

然后在$.ajax成功:

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

我希望这可能有所帮助。

答案 2 :(得分:4)

这应该可以正常工作:

var date = new Date(parseInt(jsonDate.substr(6)));

substr函数取出“/ Date(”部分,并且parseInt函数获取整数并忽略最后的“)/”。

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

var date = new Date(jsonDate); //no ugly parsing needed; full timezone support

这已经修复并讨论了这个previous post

答案 3 :(得分:3)

使用date.js脚本。请尝试以下

new Date(parseInt(yourDateValue)).toString("ddd, dd-MMM-yyyy, hh:mm:ss")

答案 4 :(得分:1)

如果您正在使用Javascript解析WCF JSON日期响应,则Moment.js日期框架会消除大部分问题:Moment.js - Parsing ASP.NET JSON Dates。它还有其他一些方便的方法。

答案 5 :(得分:0)

我们生成data.js作为OData服务的JavaScript客户端。如果您从Web客户端工作,使用此库将消除这种麻烦,并防止您遇到其他人。

Data.js代表您处理所有JSONP和其他问题,从而轻松地请求和解析JSON数据:

OData.read( 
  "http://services.odata.org/Northwind/Northwind.svc/Categories", 
  function (data) { 
    var html = ""; 
    $.each(data.results, function(l) { html += "<div>" + l.CategoryName + "</div>"; }); 
    $(html).appendTo($("#target-element-id")); 
  } 
);

答案 6 :(得分:0)

试试这个:

    function getDate(datestr) {
        return  new Date(eval('new ' + datestr.replace(/\//g, '')));
    }

答案 7 :(得分:0)

此回复可能会被拒绝(!!)但另一种解决方案是更改您的WCF服务以更友好的方式返回日期。

以下是我的WCF服务中的一些示例JSON,显示UpdateDateOriginal值(使用WCF用于我的DateTime值的恼人的默认格式),以及相同DateTime值的友好UpdateDate版本

enter image description here

我已在以下文章中发布了代码:

Change default date serialization in WCF