我相信我在这里遗漏了一些明显的东西。当我从 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))时,我得到以下结果:alt text

当我使用 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 中,有 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'));
            });
        }

我希望这可能会有帮助。

这应该可以正常工作:

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 更改默认日期系列化

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top