代码之家  ›  专栏  ›  技术社区  ›  Andy May

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

  •  20
  • Andy May  · 技术社区  · 14 年前

    我想我遗漏了一些明显的东西。当我从OData服务请求JSON响应时,得到的DateTime属性结果与请求XML时不同。我将以NerdDinner OData提要为例。

    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>
    

    alt text

    当我用LINQPad运行相同的查询时,我也得到了一个晚上8点的结果。 为什么JSON结果中的时区不正确?

    我在客户机上使用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");
     }
    
    8 回复  |  直到 14 年前
        1
  •  19
  •   Community datashaman    7 年前

    根据 this msdn link DateTime 对象是。。。

    “/”。滴答声的数量是一个数字 正或负长值 指示刻度数 (毫秒) UTC 1970年1月1日午夜。

    所以.NET假设的是正确的,但是它是UTC而不是GMT(尽管如此) they are similar ). 有 some good answers

    TimeZoneInfo 具有 ConvertTimeFromUtc JavaScriptConverter 班级。在javascript中,有 UTC getTimezoneOffset

        2
  •  7
  •   Andrea Celin    13 年前

    如果这可能有帮助的话,我也面临同样的问题,我最终实现了这样的东西,虽然不那么优雅,但它是有效的。

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

        3
  •  5
  •   Community datashaman    7 年前

    这应该很管用:

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

    substr函数取出“/Date”(“部分”,parseInt函数获取整数并忽略末尾的“/”。

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

    这是已经修复和讨论,看看这个 previous post

        4
  •  3
  •   Navoneel Talukdar    8 年前

    使用日期.js剧本。试试看在下面

    new Date(parseInt(yourDateValue)).toString("ddd, dd-MMM-yyyy, hh:mm:ss")
    
        5
  •  1
  •   Alex Ross    12 年前

    Moment.js - Parsing ASP.NET JSON Dates . 它还有其他一些方便的方法。

        6
  •  0
  •   Mark Stafford - MSFT    12 年前

    data.js 作为OData服务的JavaScript客户端。如果您是在Web客户机上工作,使用此库将消除此问题,并防止您遇到其他人。

    数据.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")); 
      } 
    );
    
        7
  •  0
  •   Anton Sivov    11 年前

    试试这个:

        function getDate(datestr) {
            return  new Date(eval('new ' + datestr.replace(/\//g, '')));
        }
    
        8
  •  0
  •   Community datashaman    7 年前

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

    UpdateDateOriginal 值(使用WCF为我的DateTime值使用的恼人的默认格式),并且更友好 UpdateDate 相同日期时间值的版本。

    enter image description here

    Change default date serialization in WCF