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

问题描述:

我相信我在这里丢失了一些明显的东西。当我从OData服务请求一个JSON响应时,我得到的DateTime属性的结果与我请求XML时的结果不同。我将以NerdDinner OData提要为例。如何处理从WCF数据服务(OData)返回的json DateTime

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"); 
} 

根据this msdn linkDateTime对象是...

...在JSON表示为 “/日期(蜱的数目 )/”。点滴的数量为 正数或负数长值, 指示自从 午夜01 UTC,1970年起已经过去的滴答数 (毫秒)。

因此,你认为.NET是正确的,但它是UTC而不是GMT(尽管they are similar)。在SO上有somegoodanswers,它提供了更多细节,并提供了将JSON解析为客户端可用日期的方法。

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

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

如果这可能有帮助,我面临同样的问题,我结束实施这样的事情,不是很优雅,但它的工作。

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')); 
      }); 
     } 

我希望这会有所帮助。

使用date.js script.Try下面

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

我们生产data.js以JavaScript客户端的OData服务。如果你是从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")); 
    } 
); 

如果你解析的Javascript WCF JSON日期的响应,那一刻。 js日期框架消除了许多头痛:Moment.js - Parsing ASP.NET JSON Dates。它还有其他一些方便的方法。

试试这个:

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

这应该只是罚款:

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

SUBSTR函数取出 “/日期(” 部分,而parseInt函数函数获取整数,而忽略“)/“ 最后。

对于ISO-8601格式的JSON日期,只是通过串入Date构造函数:

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

这已经固定,并讨论了一看这previous post

这个回答可能会否决(!!),但另一种解决方案是只需更改WCF服务以更友好的方式返回日期。

下面是从我的WCF服务,呈现出UpdateDateOriginal值(使用WCF已经用于我的DateTime值烦人的默认格式)的一些样品JSON和友好UpdateDate版本的同一日期时间价值。

enter image description here

我已经发布的代码下面的文章中来做到这一点:

Change default date serialization in WCF