先看一下代码:
'use strict'; angular.module('app.filters',[]).filter('ordinalDate',['$filter',function($filter) { /** * 将给定的天数输出以下格式:d'th',d'st',d'nd',d'rd',* 因为按习惯是这样:1st 2nd 3rd 4-20th 21st 22nd 23rd 24-30th 31st * @param number * @returns {string} */ var getOrdinalSuffix = function(number) { var suffixes = ["'th'","'st'","'nd'","'rd'"]; var relevantDigits = (number < 30) ? number % 20 : number % 30; return "d" + ((relevantDigits <= 3) ? suffixes[relevantDigits] : suffixes[0]); }; /** * /d+((?!\w*(?=')))|d$/g; 这段正则分解以下: *(1)/d+ 表示全局从d字符开始匹配。表示的不是数字,而是字符"d",+表示连接符号,如"a"+"b"=“ab”这样 *(2)?!表示反向匹配,如d可以可以匹配上,而如果是其他字符就匹配不上, *(3)?='表示只匹配'开头的,如d'aa',ds就不匹配了./d+(?!\w*(?='))表示只匹配:d其他字符,不匹配:d'其他字符' *(4)/g表示全局匹配 *(5)/d+((?!\w*(?=')))|d$/g;如果匹配上则会输出:d或dd,否则null,匹配类似:[d其他字符] 这样的字符,不匹配:[d'其他字符'] 这种类型 */ return function(timestamp,format) { var regex = /d+((?!\w*(?=')))|d$/g;//提取d或dd var date = new Date(timestamp); var dayOfMonth = date.getDate(); var suffix = getOrdinalSuffix(dayOfMonth); if(format != undefined){ format = format.replace(regex,function (match) { return match === "d" ? suffix : match; //如果提取的结果为d,则返回:d'th'形式,否则输出dd }); } return $filter('date')(date,format); }; }]);
这段代码作用就是将给定的时间戳按给定的时间格式输出,以下是几个测试的例子:
{{ 1488181707000 | ordinalDate :"yyyy-MM-dd HH:mm:ss"}} //输出:2017-02-27 15:48:27 {{ 1488181707000 | ordinalDate :"yyyy-MM-d HH:mm:ss"}} //输出:2017-02-27th 15:48:27 {{ 1488181707000 | ordinalDate :"yyyy-MM-dUm HH:mm:ss"}} //输出:2017-02-27thU48 15:48:27 {{ 1488181707000 | ordinalDate :"yyyy-MM-d'Um' HH:mm:ss"}} //输出:2017-02-27Um 15:48:27
js正则语法: