如何处理从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))我得到这样的结果:
我当我使用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 link,DateTime
对象是...
...在JSON表示为 “/日期(蜱的数目 )/”。点滴的数量为 正数或负数长值, 指示自从 午夜01 UTC,1970年起已经过去的滴答数 (毫秒)。
因此,你认为.NET是正确的,但它是UTC而不是GMT(尽管they are similar)。在SO上有somegoodanswers,它提供了更多细节,并提供了将JSON解析为客户端可用日期的方法。
只要将日期从UTC转换为特定时区,在服务器上就可以使用TimeZoneInfo
类,该类有ConvertTimeFromUtc
方法。或者你可以编写一个继承自JavaScriptConverter
类的自定义转换器。在javascript中,可以使用UTC
和getTimezoneOffset
方法。
希望这会有所帮助,祝你好运。
如果这可能有帮助,我面临同样的问题,我结束实施这样的事情,不是很优雅,但它的工作。
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
版本的同一日期时间价值。
我已经发布的代码下面的文章中来做到这一点: