【问题标题】:Apply date filter multiple times多次应用日期过滤器
【发布时间】:2013-10-31 05:19:12
【问题描述】:

在我的 Angular 应用程序中,我正在调用 WCF REST 服务,它返回一个数组 ob 对象,其中一个属性是 DateTime 类型,它以这种形式在 JSON 中序列化

[{"date":"\/Date(1295164800000-0800)\/",...

为了在我的模板中很好地显示它,我创建了一个过滤器来将该 JSON 表示转换为 JavaScript Date 对象。

eventsApp.filter("fromMSDate", function(){
   return function (jsonDate) {
       var D, dtime, T, tz, off,
           dobj = jsonDate.match(/(\d+)|([+-])|(\d{4})/g);
       T = parseInt(dobj[0]);
       tz = dobj[1];
       off = dobj[2];
       if (off) {
           off = (parseInt(off.substring(0, 2), 10) * 3600000) +
               (parseInt(off.substring(2), 10) * 60000);
           if (tz == '-') off *= -1;
       }
       else off = 0;
       return new Date(T + off).toUTCString();
   }
});

我就是这样用的

            <span class="span1">Date:</span>
            <span>{{event.date | fromMSDate}}</span>

所有工作都按需要进行,我确实在页面中显示了一个 JS Date 对象,但我不喜欢这种格式,所以我尝试应用 'date' 过滤器但没有成功。

            <span class="span1">Date:</span>
            <span>{{event.date | fromMSDate | date:'medium'}}</span>

date 过滤器由于某种原因被忽略,日期显示为Fri, 15 Mar 2013 00:00:00 GMT

我在这里做错了什么?

谢谢

【问题讨论】:

    标签: javascript json wcf date angularjs


    【解决方案1】:

    Date.prototype.toUTCString 以 Angular 的日期过滤器无法识别的格式(“星期一,2006 年 7 月 3 日 21:44:38 GMT”)返回日期。

    From date filter docs:

    [Param date:] 要格式化为 Date 对象的日期,毫秒 (字符串或数字)或各种 ISO 8601 日期时间字符串格式(例如 yyyy-MM-ddTHH:mm:ss.SSSZ 及其较短的版本,如 yyyy-MM-ddTHH:mmZ、yyyy-MM-dd 或 yyyyMMddTHHmmssZ)。如果没有时区 在字符串输入中指定的时间被认为是在 当地时区。

    因此,要生成日期过滤器可以理解的格式,请使用Date.prototype.toISOString,它会以日期过滤器兼容格式(“2013-10-31T08:36:14.601Z”)生成日期。

    app.controller('AppCtrl', function($scope){
      $scope.jsonDate = "\/Date(1295164800000-0800)\/";
    });
    
    app.filter("fromMSDate", function(){
     return function (jsonDate) {
       var D, dtime, T, tz, off,
       dobj = jsonDate.match(/(\d+)|([+-])|(\d{4})/g);
       T = parseInt(dobj[0]);
       tz = dobj[1];
       off = dobj[2];
       if (off) {
         off = (parseInt(off.substring(0, 2), 10) * 3600000) +
               (parseInt(off.substring(2), 10) * 60000);
         if (tz == '-') off *= -1;
       }
       else off = 0;
       return new Date(T + off).toISOString();
     }
    });
    
    <div ng-controller="AppCtrl">
    
      <div>date json: {{jsonDate}}</div> <!-- == /Date(1295164800000-0800)/ -->
      <div>date fromMSDate: {{jsonDate | fromMSDate}}</div> <!-- == 2011-01-16T00:00:00.000Z -->
      <div>date medium: {{jsonDate | fromMSDate | date:'medium'}}</div> <!-- == Jan 16, 2011 1:00:00 AM -->
      <div>date short: {{jsonDate | fromMSDate | date:'short'}}</div> <!-- == 1/16/11 1:00 AM -->
    
    </div>
    

    【讨论】:

    • 谢谢。按预期工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-07
    • 2012-10-05
    • 1970-01-01
    • 2015-08-30
    • 2014-10-20
    相关资源
    最近更新 更多