分析JS版的格式化日期

感谢 meizz 大神写的时间格式化通用函数,作为学习,简单解析一下 

Date.prototype.format = function(format) 
{
  var o = {
    "M+" : this.getMonth()+1, //month
    "d+" : this.getDate(),    //day
    "h+" : this.getHours(),   //hour
    "m+" : this.getMinutes(), //minute
    "s+" : this.getSeconds(), //second
    "q+" : Math.floor((this.getMonth()+3)/3),  //quarter
    "S" : this.getMilliseconds() //millisecond
  }
  // 这块代码的主要作用:根据 y 格式化当前年 yyyy = 2019  yy = 19
  if(/(y+)/.test(format)){  // 如果包含y的话,也就是有年   RegExp.$1 => 代表匹配的第一组内容
      format=format.replace(RegExp.$1,(this.getFullYear()+"").substr(4 - RegExp.$1.length));   
  } 
  for(var k in o){
      if(new RegExp("("+ k +")").test(format)){
        format = format.replace(RegExp.$1,RegExp.$1.length==1 ? o[k] : ("00"+ o[k]).substr((""+ o[k]).length));  
      }
  }     
  return format;
}
alert(new Date().format("yyyy-MM-dd hh:mm:ss"));

【分析】

 

当前的日期格式化的核心思想就是正则替换

 

第3行到第11行代码主要用来存储每一个格式化字符对应的当前日期的具体信息

关于正则的加号(+)解释:

量词符,表示匹配目标一次或多次,表明目标在对应字符串中所出现的次数不得少于一次。

 

第13行到第15行代码主要是将格式化字符串中出现的y替换为对应的年,最长4个字符(yyyy),最少1个(y)

关于 RegExp.$1 的解释:匹配成功的第一组内容,对于非法的格式化字符串(yyyy-y)可以进行有效过滤,返回的结果将是格式化错误

对于截取的逻辑:

本人觉得可以改成 substr((-RegExp.$1.length)),其实对应的含义是一样的

 

第16行到第20行代码主要是将格式化字符串中剩余的字符替换为对应的日期信息

主要逻辑:

format = format.replace(RegExp.$1,RegExp.$1.length==1 ? o[k] : ("00"+ o[k]).substr((""+ o[k]).length));

如果匹配成功的第一组内容的长度为1,则直接返回对应的日期信息;

否则,通过再次格式化(MM => "05" dd=>"17")起了一个对单位数日期进行追加零的效果

 

【参考文章】

javascript Date format(js日期格式化)(转)

时间对象的格式化

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值