题目描述
按所给的时间格式输出指定的时间
格式说明
对于 2014.09.05 13:14:20
yyyy: 年份,2014
yy: 年份,14
MM: 月份,补满两位,09
M: 月份, 9
dd: 日期,补满两位,05
d: 日期, 5
HH: 24制小时,补满两位,13
H: 24制小时,13
hh: 12制小时,补满两位,01
h: 12制小时,1
mm: 分钟,补满两位,14
m: 分钟,14
ss: 秒,补满两位,20
s: 秒,20
w: 星期,为 ['日', '一', '二', '三', '四', '五', '六'] 中的某一个,本 demo 结果为 五
示例1
输入
formatDate(new Date(1409894060000), 'yyyy-MM-dd HH:mm:ss 星期w')
输出
2014-09-05 13:14:20 星期五
代码
Data对象
在JS中使用Date对象来表示一个时间,其中Date()为一个构造函数
如果直接使用构造函数创建一个Date对象,则会封装为当前代码执行时间
var d = new Date();
如果想要显示一个指定的时间,则应该在构造函数中传入一个表示时间的字符串
var d2 = new Date("1/3/2019"); // 月/日/年 时间都为北京时间
对象名.getDate() //获取当前时间对象是几号
对象名.getDay() //获取当前时间对象时周几 ,0表示周日
对象名.getMonth() //获取当前时间对象的月份 0表示1月,1表示2月...
对象名.getFullYear() //获取当前时间对象的年份
对象名.getTime() //获取当前时间对象的时间戳,时间戳指的是从格林威治标准时间的1970年1月1日,0时0分0秒到
当前日期对象所花费的毫秒数(1秒=1000毫秒)
Date.now() //获取当前代码执行时的时间的时间戳
replace()方法
ECMAScript v3 规定:
replace() 方法的参数 replacement 可以是函数而不是字符串。
在这种情况下,每个匹配都调用该函数,它返回的字符串将作为替换文本使用。
该函数的第一个参数是匹配模式的字符串。接下来的参数是与模式中的子表达式匹配的字符串,可以有 0 个或多个这样的参数。接下来的参数是一个整数,声明了匹配在 stringObject 中出现的位置。
最后一个参数是 stringObject 本身。
例子:
在本例中,我们将把字符串中所有单词的首字母都转换为大写:
name = 'aaa bbb ccc';
uw=name.replace(/\b\w+\b/g, function(word){
return word.substring(0,1).toUpperCase()+word.substring(1);}
);
在本题目中,结合上面的正则表达式:a,模式的匹配项;k,第一个捕获组的匹配项;v,第二个捕获组的匹配项。
答案
function formatDate(t,str){
var obj = {
yyyy:t.getFullYear(),
yy:(""+ t.getFullYear()).slice(-2),
M:t.getMonth()+1, //getMonth得到的是0-11,+1以后才是月份
MM:("0"+ (t.getMonth()+1)).slice(-2),
d:t.getDate(),
dd:("0" + t.getDate()).slice(-2),
H:t.getHours(),
HH:("0" + t.getHours()).slice(-2),
h:t.getHours() % 12,
hh:("0"+t.getHours() % 12).slice(-2),
m:t.getMinutes(),
mm:("0" + t.getMinutes()).slice(-2),
s:t.getSeconds(),
ss:("0" + t.getSeconds()).slice(-2),
w:['日', '一', '二', '三', '四', '五', '六'][t.getDay()] //第二个参数是第一个数组的下标,比如[1, 2, 4][0] === 1
};
return str.replace(/([a-z]+)/ig,function($1){return obj[$1]});
}
运行环境:JavaScript (V8 6.0.0)
运行时间:958ms
占用内存:77920KB