• javaScript prototype实例(正则) 自定义日期格式化方法


    一个JS自定义日期格式化方法,包括了不少知识点,以下方法来自jQuery DataTable中文的官方参考

    //return (new Date(data)).Format("yyyy-MM-dd hh:mm:ss"); 
    Date.prototype.Format = function (fmt) { 
        var o = {
            "M+": this.getMonth() + 1,//当前对象的"月"
            //月份
            "d+": this.getDate(),//当前对象的"日"
            //日
            "h+": this.getHours(),
            //小时
            "m+": this.getMinutes(),
            //分
            "s+": this.getSeconds(),
            //秒
            "q+": Math.floor((this.getMonth() + 3) / 3),
            //季度
            "S": this.getMilliseconds() //毫秒
        };
        if (/(y+)/.test(fmt)) {  //开始解析由参数传入的模板,将模板中的y"刷"成实际年,RegExp.$1是模板中被替换字符,参数2是实际年份,但是需要根据年份的模板长度来截取,如年份模板是yyyy,substr(0),效果是从年份字符串起始位置0处截取年份,如果年份模板是yy,那么substr(2),表示从年份字符串第3位置截取年份
            fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
        }
        for (var k in o) { //遍历正则模板与对应的值
            if (new RegExp("(" + k + ")").test(fmt)) {
                fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));//模板对应的占位符替换实际的日期值,o[k]当前日期对象值(年,月,日,分,时,秒),
            }
        }
        return fmt;
    }

    思考: 怎样根据日期模板来填充实际时间; 程序要解决的问题包括, 解析日期模板,当然日期模板含义是预定义的,如yyyy在解析时就用年份替换.
    程序逻辑:1).判断模板中有"年份"模板吗? 2).通过正则表达式定位模板中的年份字面值(RegExp.$1);3).获取实际年份值(this.getFullYear()),在获取实际年份值时,外带考虑模板的长度来截取年份;4).这里正则表达式对象用了2种语法,值得学习,使用new RegExp()方式是因为正则表达式对象是"动态"拼接;5).遍历JS对象的属性名和属性值很巧妙的编程方式,和PHP中的关联数组很像
    6).替换模板与替换值用JS对象的数据结构进行封装,感觉非常妙.
    stringObj.replace(old, new)
    fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
    当模板中被提取的要被替换的占位符长度=1时,就直接将对象属性值进行replace,所以程序是支持"y-M-d h:m:s"这样的短模板的。
    004.length的值居然是1,并且由于原始的o[k]数据类型不是string,它没有length属性,所以使用+""方式将其转化成string。
    为什么要做RegExp.$1.length == 1这样的判断,是因为当要被替换的占位符长度>1时,使用("00" + o[k]).substr(("" + o[k]).length))这样的字符进行模板填充
    ("00" + o[k]).substr(("" + o[k]).length)),o[k]值的长度不满2位时,补0技巧代码,注意只适用时间2位长度字面值的处理.

    题外话,我不知道这么妙的方法是不是原创于中国的大牛之手,我觉得里面充满了对JS的原生理解.

    参考JS中的prototype

  • 相关阅读:
    课堂作业04 2017.10.27
    课程作业 03 动手动脑 2017.10.20
    课程作业 03 2017.10.20
    HDU 3974 Assign the task
    POJ 2155 Matrix
    POJ 2481 Cows
    HDU 3038 How Many Answers Are Wrong
    CS Academy Array Removal
    POJ_1330 Nearest Common Ancestors LCA
    CF Round 427 D. Palindromic characteristics
  • 原文地址:https://www.cnblogs.com/zhuji/p/9304075.html
Copyright © 2020-2023  润新知