87,964
社区成员
发帖
与我相关
我的任务
分享
// 对Date的扩展,将 Date 转化为指定格式的String
// 月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符,
// 年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
// 例子:
// (new Date()).Format("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423
// (new Date()).Format("yyyy-M-d h:m:s.S") ==> 2006-7-2 8:9:4.18
Date.prototype.Format = function (fmt) { //author: meizz
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)) 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)));
return fmt;
}调用: var time1 = new Date().Format("yyyy-MM-dd");var time2 = new Date().Format("yyyy-MM-dd HH:mm:ss");
"M+": this.getMonth() + 1, //月份
/(y+)/.test(fmt)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<script>
// 对Date的扩展,将 Date 转化为指定格式的String
// 月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符,
// 年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
// 例子:
// (new Date()).Format("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423
// (new Date()).Format("yyyy-M-d h:m:s.S") ==> 2006-7-2 8:9:4.18
Date.prototype.Format = function(fmt) { //author: meizz
// "M+"、"d+"、"s+" 都是要被转换化为正则对象的
// 对象{name:value,...} 的 名值对(name:value) 中的 name 的命名规则:
// 1. 标识符(跟变量的命名规则一致);
// 2. 任意字符串(如"","@#"),例, ({"@#":1})["@#"]
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() //毫秒
};
// fmt = "yyyy-MM-dd"
// 现在时间:2015-09-13 11:29:36
if ( /(y+)/.test( fmt ) ) { // 测试 匹配字符串fmt("yyyy-MM-dd")是否包含“y”
// RegExp.$1 : 代表“yyyy”,将被替换为“2015”
// 如果fmt的年份是2位则取后两位,如 09/13/15(月月日日年年)
var year = ( this.getFullYear() + "" ).substr( 4 - RegExp.$1.length ); // year = "2015"
fmt = fmt.replace( RegExp.$1 , year ); // fmt = "2015-MM-dd"
};
for ( var k in o ) {
// 创建正则对象的两种方式:
// 1,var regex = /[1-9]{1,7}/;
// 2. var regex = new RegExp( "[1-9]{1,7}" );
if ( new RegExp( "(" + k + ")") .test( fmt ) ) {
var temp = ( RegExp.$1.length == 1 ) ? // 是否检测到 毫秒的部分("S")
( o[ k ] )
:
( ( "00" + o[k] ).substr( ( "" + o[k] ).length ) ); // 补零
fmt = fmt.replace( RegExp.$1, temp )
};
}
return fmt;
}
// 调用:
var time1 = new Date().Format("yyyy-MM-dd");
var time2 = new Date().Format("yyyy-MM-dd hh:mm:ss");
console.info( time1, time2 ); //=> 2015-09-13 2015-09-13 11:29:36
</script>
</body>
</html>
new RegExp("(" + k + ")")
这里为什么不直接用new RegExp( k )
实在看不懂
<script language="javascript" type="text/javascript">
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
}
for(var k in o)
{
format =format+o[k]
}
}
alert(new Date().format("yyyy年MM月dd日"));
</script>
为什么这么写不对?[/quote]
"M+"这个字符串最终会用于创建正则表达式,在正则表达式中 + 号匹配其前面的字符一次或多次。
<script language="javascript" type="text/javascript">
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
}
for(var k in o)
{
format =format+o[k]
}
}
alert(new Date().format("yyyy年MM月dd日"));
</script>
为什么这么写不对?