如何处理从 WCF 数据服务 (OData) 返回的 json DateTime
-
26-09-2019 - |
题
我相信我在这里遗漏了一些明显的东西。当我从 OData 服务请求 JSON 响应时,我得到的 DateTime 属性结果与请求 XML 时得到的结果不同。我将使用 NerdDinner OData 源作为示例。
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 运行相同的查询时,我也得到了晚上 8 点的结果。 为什么 JSON 结果中的时区不正确? 似乎假设响应是在 GMT 时间。我应该在客户端上处理这个问题(通过javascript)还是可以在服务器上设置?
我在客户端上使用 jQuery,在服务器上使用 WCF 数据服务(和实体框架)。
更新:
我在用 日期 在客户端处理 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");
}
解决方案
根据 这个msdn链接, DateTime
对象是...
...在 JSON 中表示为“/Date(number 的刻度)/”。刻度数为 正或负多头值 指示刻度数 (毫秒)自那以后 1970 年 1 月 1 日午夜 UTC。
所以你的.NET假设是正确的,但它是UTC而不是GMT(尽管 他们很相似)。有 一些 好的 答案 这里提供了更多详细信息,并提供了将 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'));
});
}
我希望这可能会有帮助。
这应该可以正常工作:
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
这已经被修复并讨论过,看看这个 上一篇文章
使用date.js script.Try以下
new Date(parseInt(yourDateValue)).toString("ddd, dd-MMM-yyyy, hh:mm:ss")
如果您正在解析的Javascript WCF JSON日期的响应,Moment.js日期框架大大消除头痛:的 Moment.js - 解析ASP.NET JSON日期的。它也有一些其它方便的方法。
我们生产的 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"));
}
);
尝试这种情况:
function getDate(datestr) {
return new Date(eval('new ' + datestr.replace(/\//g, '')));
}
此回复可能会被否决(!),但另一种解决方法就是改变你的WCF服务以更友好的方式返回的日期。
下面是从我的WCF服务的一些示例JSON,表示UpdateDateOriginal
值(使用恼人的默认格式即WCF已经用于我的日期时间值),和相同的日期时间值的一个友好UpdateDate
版本。
我已经发布的代码下面的文章中来做到这一点:
在WCF 更改默认日期系列化