我相信我在这里遗漏了一些明显的东西。当我从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))时,我得到以下结果:
当我使用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");
}
答案 0 :(得分:19)
根据this msdn link,DateTime
个对象是......
...在JSON中表示为“/ Date(数字 of ticks)/“。滴答数是a 积极或消极的长期价值 表示刻度数 从那以后经过的(毫秒) 1970年1月1日午夜,UTC。
所以你认为.NET是正确的,但它是UTC而不是GMT(尽管they are similar)。这里有some good answers提供了更多详细信息,并提供了将JSON解析为客户端上的可用日期的方法。
就将日期从UTC转换为特定时区而言,您可以在服务器上使用TimeZoneInfo
类ConvertTimeFromUtc
方法。或者您可以编写一个继承自JavaScriptConverter
类的自定义转换器。在javascript中,可以使用UTC
和getTimezoneOffset
方法。
希望这会有所帮助,祝你好运。
答案 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
版本
我已在以下文章中发布了代码: