zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Windows Server 2008取消登录前的Ctrl+Alt+Delete组合键操作
    Kali Linux远程连接Windows服务器
    Kali Linux虚拟机安装完整安装过程及简单配置(视频)
    Kali Linux中下载工具Axel的安装和使用
    2017年Kali Linux更新源
    解决VMware虚拟机报错“无法连接MKS:套接字连接尝试次数太多,正在放弃”
    .deb软件包的安装和软件的卸载
    解决C语言程序报错:return type defaults to‘int’
    解决BackBox中Fcitx输入法中文输入状态下不显示候选词框的问题
    导航狗信息导航网站首页源代码(2017年11月03日版)
  • 原文地址:https://www.cnblogs.com/zhuji/p/9304075.html
Copyright © 2011-2022 走看看