Javascript json对象的Angular.js格式日期

Javascript json对象的Angular.js格式日期,javascript,json,angularjs,date,format,Javascript,Json,Angularjs,Date,Format,我的json响应如下所示: [{"Id":"dab4580b-e24d-49f8-9fd5-2e968b10d3b5","Title":"MVVM-Sidekick 入精","CreatedOn":"\/Date(1390272893353)\/","IsChecked":false},{"Id":"66a0f134-e240-4cc4-96fa-ac3807853ca7","Title":"Windows Phone 开发入精","CreatedOn":"\/Date(139001844708

我的json响应如下所示:

[{"Id":"dab4580b-e24d-49f8-9fd5-2e968b10d3b5","Title":"MVVM-Sidekick 入精","CreatedOn":"\/Date(1390272893353)\/","IsChecked":false},{"Id":"66a0f134-e240-4cc4-96fa-ac3807853ca7","Title":"Windows Phone 开发入精","CreatedOn":"\/Date(1390018447080)\/","IsChecked":false}]
“CreatedOn”日期的格式如下:'/date(1390272893353)/'

将此结果绑定到html表时,无法格式化日期:

<td>{{item.CreatedOn | date: 'yyyy-MM-dd HH:mm'}}</td>
{item.CreatedOn|date:'yyyyy-MM-dd HH:MM'}
仍然给我:

/日期(1390272893353)/


我不想更改服务器端的任何代码(不要修改json字符串),格式化此日期的最佳方式是什么?

Angular date筛选器需要JS日期。因此,您需要在将JSON日期提供给过滤器之前解析它

试试这个:

<td>{{item.CreatedOnParsed | date: 'yyyy-MM-dd HH:mm'}}</td>
如图所示

编辑 正如您在文章中的评论所看到的,对于日期过滤器来说,即使只是时间戳也足够了,所以即使这样也应该足够了:

$scope.item.CreatedOnParsed =  item.CreatedOn.substr(6);

一种选择是编写另一个过滤器并将其放入链中。例如:

app.filter("mydate", function() {
    var re = /\/Date\(([0-9]*)\)\//;
    return function(x) {
        var m = x.match(re);
        if( m ) return new Date(parseInt(m[1]));
        else return null;
    };
});
基本上,它使用正则表达式来解析字符串并生成一个
日期
(如果格式与所示格式不同,则必须调整正则表达式)

将其用作:

<td>{{item.CreatedOn | mydate | date: 'yyyy-MM-dd HH:mm'}}</td>
{{item.CreatedOn | mydate | date:'yyyy-MM-dd HH:MM'}

实际上,我将@Charminbear和@Nikos的答案组合在这个过滤器中,这个过滤器非常好用,没有正则表达式也非常清晰:

myApp.filter("jsDate", function () {
    return function (x) {
        return new Date(parseInt(x.substr(6)));
    };
});
这使得写作成为可能

{{ $scope.item.CreatedOn | jsDate | date:"yyyy-MM-dd" }}

另一个可能更好的选择是在接收JSON时解析日期

我使用以下功能:

(function() {
    if (JSON && !JSON.parseWithDate) {
        JSON.parseWithoutDate = JSON.parse; //Store the original JSON.parse function

        var reISO = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/;  
        var reMsAjax = /^\/Date\((d|-|.*)\)[\/|\\]$/;  

        JSON.parseWithDate = function (json) {  
            /// <summary>  
            /// parses a JSON string and turns ISO or MSAJAX date strings  
            /// into native JS date objects  
            /// </summary>      
            /// <param name="json" type="var">json with dates to parse</param>          
            /// </param>  
            /// <returns type="value, array or object" />  
            try {  
                var res = JSON.parseWithoutDate(json,
                function (key, value) {  
                    if (typeof value === 'string') {  
                        var a = reISO.exec(value);  
                        if (a)  
                            return new Date(Date.UTC(+a[1], +a[2] - 1,   
                                                     +a[3], +a[4], +a[5], +a[6]));  
                        a = reMsAjax.exec(value);  
                        if (a) {  
                            var b = a[1].split(/[-+,.]/);  
                            return new Date(b[0] ? +b[0] : 0 - +b[1]);  
                        }  
                    }  
                    return value;  
                });  
                return res;  
            } catch (e) {  
                // orignal error thrown has no error message so rethrow with message  
                throw new Error("JSON content could not be parsed");  
                return null;  
            }  
        };  
        JSON.dateStringToDate = function (dtString) {  
            /// <summary>  
            /// Converts a JSON ISO or MSAJAX string into a date object  
            /// </summary>      
            /// <param name="" type="var">Date String</param>  
            /// <returns type="date or null if invalid" />   
            var a = reISO.exec(dtString);  
            if (a)  
                return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3],   
                                         +a[4], +a[5], +a[6]));  
            a = reMsAjax.exec(dtString);  
            if (a) {  
                var b = a[1].split(/[-,.]/);  
                return new Date(+b[0]);  
            }  
            return null;  
        };  
        JSON.stringifyWcf = function (json) {  
            /// <summary>  
            /// Wcf specific stringify that encodes dates in the  
            /// a WCF compatible format ("/Date(9991231231)/")  
            /// Note: this format works ONLY with WCF.   
            ///       ASMX can use ISO dates as of .NET 3.5 SP1  
            /// </summary>  
            /// <param name="key" type="var">property name</param>  
            /// <param name="value" type="var">value of the property</param>           
            return JSON.stringify(json, function (key, value) {  
                if (typeof value == "string") {  
                    var a = reISO.exec(value);  
                    if (a) {  
                        var val = '/Date(' +   
                                  new Date(Date.UTC(+a[1], +a[2] - 1,   
                                           +a[3], +a[4],   
                                           +a[5], +a[6])).getTime() + ')/';  
                        this[key] = val;  
                        return val;  
                    }  
                }  
                return value;  
            })  
        };  
        //Make Date parsing the default
        JSON.parse = JSON.parseWithDate;
    }
})();
(函数(){
if(JSON&&!JSON.parseWithDate){
JSON.parseWithoutDate=JSON.parse;//存储原始的JSON.parse函数
var reISO=/^(\d{4})-(d{2})-(d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/;
var reMsAjax=/^\/Date\((d |-|*)[\/|\]$/;
JSON.parseWithDate=函数(JSON){
///   
///解析JSON字符串并转换ISO或MSAJAX日期字符串
///转换为本机JS日期对象
///       
///带有要解析的日期的json
///   
///   
试试{
var res=JSON.parseWithoutDate(JSON,
函数(键、值){
如果(值的类型=='string'){
var a=reISO.exec(值);
如果(a)
返回新日期(UTC日期(+a[1],+a[2]-1,
+a[3]、+a[4]、+a[5]、+a[6]);
a=reMsAjax.exec(值);
如果(a){
变量b=a[1]。拆分(/[-+,.]/);
返回新日期(b[0]?+b[0]:0-+b[1]);
}  
}  
返回值;
});  
返回res;
}第(e)款{
//引发的原始错误没有错误消息,因此使用消息重新引发
抛出新错误(“无法解析JSON内容”);
返回null;
}  
};  
JSON.dateStringToDate=函数(dtString){
///   
///将JSON ISO或MSAJAX字符串转换为日期对象
///       
///日期字符串
///    
var a=reISO.exec(dtString);
如果(a)
返回新日期(UTC日期(+a[1],+a[2]-1,+a[3],
+a[4]、+a[5]、+a[6]);
a=reMsAjax.exec(dtString);
如果(a){
变量b=a[1]。拆分(/[-,.]/);
返回新日期(+b[0]);
}  
返回null;
};  
JSON.stringifyWcf=函数(JSON){
///   
///特定于Wcf的字符串化,在
///与WCF兼容的格式(“/Date(9991231231)/”)
///注意:此格式仅适用于WCF。
///ASMX可以使用从.NET 3.5 SP1开始的ISO日期
///   
///属性名
///财产价值
返回JSON.stringify(JSON,函数(键,值){
如果(值的类型==“字符串”){
var a=reISO.exec(值);
如果(a){
var val='/Date('+
新日期(UTC日期(+a[1],+a[2]-1,
+a[3],+a[4],
+a[5],+a[6])。getTime()+')/;
此[键]=val;
返回val;
}  
}  
返回值;
})  
};  
//将日期解析设置为默认值
JSON.parse=JSON.parseWithDate;
}
})();
从这里开始:,除了我用这个解析日期的版本覆盖了标准的JSON.parse函数。这意味着Angular将从它看到的所有JSON自动解析ASMX日期

您还可以使用angular$http转换编写自定义转换。请参阅:$http

//输入-“DocDate”:“\/Date(1127318400000-0000)\/”
-------

我知道我参加晚会要迟到了。但我想告诉你是什么帮助了我:-

<td>{{item.yourdatefield.slice(6,-2) | date:'dd-MMM-yyyy' }}</td>
{{item.yourdatefield.slice(6,-2)|日期:'dd-MMM-yyyy'}

希望它能帮助像我这样懒惰的程序员。:)

假设这是一个.net JSON日期,并且您使用的是moment.js。然后将其功能()利用到过滤器中

 myApp.filter('JSONdate', [
       '$filter', function ($filter) {
           return function (input, appformat) {
               if (input != null) {
                   return moment(input).format(appformat);
                   // use the line below if you want to leverage the standard date filter on top of this 
                   // return $filter('date')(new Date(moment(input)), appformat);
               } else {
                   return '';
               }
           };
       }])

1390272893353
的输出是什么?@haki{{1390272893353 | date:'yyyy-MM-dd HH:MM'}是预期结果,即“2014-01-21 10:54”。如果您不想测试每个属性,可能的副本可能会有所帮助。谢谢,您的解决方案有效!但是我更喜欢@Nikos Paraskevopoulos的脚本,我只是发现“{item.CreatedOn.substr(6,13)| date:'yyyy-MM-dd HH:MM'}}”也可以用。但这不是一个好代码
<td>{{item.yourdatefield.slice(6,-2) | date:'dd-MMM-yyyy' }}</td>
 myApp.filter('JSONdate', [
       '$filter', function ($filter) {
           return function (input, appformat) {
               if (input != null) {
                   return moment(input).format(appformat);
                   // use the line below if you want to leverage the standard date filter on top of this 
                   // return $filter('date')(new Date(moment(input)), appformat);
               } else {
                   return '';
               }
           };
       }])