Javascript中使用正则表达式转换时间为指定格式的字符串,详细注释。
知识点
目录
RegExp.$1~$99
- $1, $2, $3, $4, $5, $6, $7, $8, ……属性是包含括号子串匹配的正则表达式的静态和只读属性。
- $99,最多可以有99个匹配
- 这些属性可以在String.replace 方法中替换字符串. 在这种情况下, 不用在前面加上RegExp。
substr() 方法
substr() 方法可在字符串中抽取从 start 下标开始的指定数目的字符。
语法
stringObject.substr(start,length)
参数 | 描述 |
---|---|
start | 必需。要抽取的子串的起始下标。必须是数值。如果是负数,那么该参数声明从字符串的尾部开始算起的位置。也就是说,-1 指字符串中最后一个字符,-2 指倒数第二个字符,以此类推。 |
length | 可选。子串中的字符数。必须是数值。如果省略了该参数,那么返回从 stringObject 的开始位置到结尾的字串。 |
返回值
一个新的字符串,包含从 stringObject 的 start(包括 start 所指的字符) 处开始的 length 个字符。如果没有指定 length,那么返回的字符串包含从 start 到 stringObject 的结尾的字符。
提示和注释
注释:substr() 的参数指定的是子串的开始位置和长度,因此它可以替代 substring() 和 slice() 来使用。
重要事项:ECMAscript 没有对该方法进行标准化,因此反对使用它。
源码
Date.prototype.Format = function (fmt) {
var o = {
"M+": this.getMonth() + 1, //月份
"d+": this.getDate(), //日
"h+": this.getHours(), //小时
"m+": this.getMinutes(), //分
"s+": this.getSeconds(), //秒
};
/*此时
o={
"M+":1,
"d+":22,
"h+":15,
"m+":4,
"s+":22
}
fmt="yyyyMMddhhmmss"
*/
// 匹配格式化的时间是否有年份,并将其转换
if (/(y+)/.test(fmt))
{
fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
//RegExp.$1 : yyyy,换成对应的年份,最多4位。
///substr是取从参数1位置到结尾的子字符串
}
//此时fmt="2019MMddhhmmss"
//月、日、时、分、秒,替换并补0
for (var k in o) //第一个k="M+",o[k]=11
{
if (new RegExp("(" + k + ")").test(fmt))
//RegExp="(M+)", RegExp.$1="MM"
{
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
//RegExp.$1.length == 1:如果"M"只有1个,就不用补0
}
}
//此时fmt="20190122150422"
return fmt;
}
//加一些随机盐值
var requestId = new Date().Format('yyyyMMddhhmmss')+''+Math.random().toString().slice(-5)
console.log('requestId is '+requestId)