8

我有一个返回 json 的服务,如下所示:

"Results":[{"Id":"1","SomeDate":"2/19/2013 10:34:04 PM"}

当我尝试使用绑定进行格式化时,它不起作用 - 它只显示上面的字符串:

{{values.SomeDate| date:'mediumTime' }}

但是,如果我只传递这种格式,它就可以工作:

{{ '1997-03-01T00:00:00+01:00' | date:'mediumTime'}}

解决此问题的最佳方法是什么?

4

3 回答 3

12

正如 charlietfl 在评论中提到的,一个干净的选择是更新服务以返回已经与内置角度过滤器兼容的日期格式。

但是,如果这不可能,您可以设置一个自定义过滤器来解析您的日期。

我推荐的一个(非常小的)库是 Moment.js: http ://momentjs.com/

以下是关于如何将 Moment.js 包装在自定义角度过滤器中的示例博客文章: http ://www.34m0.com/2012/07/angularjs-user-friendly-date-display.html

angular.module('myModule').
    filter('fromNow', function() {
        return function(dateString) {
            return moment(new Date(dateString)).fromNow()
        };
    });

这将像这样使用:

{{ reply.createdDate | fromNow }}
于 2013-02-21T01:00:34.420 回答
9

你可以把它放在你的控制器中:

  $scope.toJsDate = function(str){
    if(!str)return null;
    return new Date(str);
  }

接着:

{{toJsDate(values.SomeDate)| date:'mediumTime' }}
于 2013-10-03T07:10:45.417 回答
0

我会支持@AlexOsborn 的建议,即使用moment.js创建自定义过滤器,因为 moment.js 可以解析包含日期的字符串。在我的过滤器实现中,我还将日期格式委托给了 moment.js,因为我觉得 moment.js 的日期格式功能比 angular.js更全面:

angular
.module("YourModuleNameHere")
.filter("formatdate", [function () {
    var result = function (date, formatstring) {
        if(formatstring === null) {
            formatstring = "DD MMM YYYY";
        }
        return moment(date).format(formatstring);
    }
    return result;
}]);

并且您使用它就像使用 angular.js 日期过滤器一样(但要格式化您将使用 moment.js 格式化代码的日期):

<p>Today is {{moment() | formatdate}}</p>
<p>Another date: {{values.SomeDate | formatdate:"ddd D MMM YYYY"}}</p>
于 2013-10-29T11:52:39.547 回答