经常会遇到格式化时间的,今天就来整理一下
首先输入的格式大概有这些:
1.2020-12-1 (年-月-日)
2.2020/12/1 (年/月/日)
3.2020-12-1 08:00
4.2020/12/1 08:00:00(年-月-日 时:分:秒)
5.2020-12-1 08:00:00(年/月/日 时:分:秒)
6.2020/12/1 08:00:00(年/月/日 时:分:秒)
7.2020-12-1 08:00:00.133(年-月-日 时:分:秒.毫秒)
8.2020/12/1 08:00:00.121(年/月/日 时:分:秒.毫秒)
输出格式(大概就这些,如果有需要可以修改模板):
1.2020年12月01日
2.2020年12月01日 08时00分
3.2020年12月01日 08时00分00秒
先来分析一下正则需求:
年4位数字组成:\d{4}
紧跟着 -或者/:[-/]
月份是由1-2位的数字组成:\d{1,2}
再紧跟着 -或者/:[-/]
日也是1-2位的数字组成:\d{1,2}
因为要把年月日都分别取出来,所以要用到分组,组合一下:
/(\d{4})[-/](\d{1,2})[-/](\d{1,2})/
再分析一下后面的时分秒,时分秒毫秒这些都有可能不出现的,所以要用到 ?
时:首先时与日之前要有空格1个以上,并且空格只匹配不捕获: (?:\s+(\d{1,2}))?
分:与时之间有冒号、并且只匹配不捕获,且分不一定出现:(?:\:(\d{1,2}))?
秒跟分是一样的:(?:\:(\d{1,2}))?
毫秒是前面有个点跟几个数字:(?:\.(\d+))?
最终:全部组合起来
/(\d{4})[-/](\d{1,2})[-/](\d{1,2})(?:\s+(\d{1,2}))?(?:\:(\d{1,2}))?(?:\:(\d{1,2}))?(?:\.(\d+))?/
制定一个时间的模板 : var dataF = "{1}年{2}月{3}日";
代码如下:
var str="2020-12-1 08:00:01"
var reg=/(\d{4})[-/](\d{1,2})[-/](\d{1,2})(?:\s+(\d{1,2}))?(?:\:(\d{1,2}))?(?:\:(\d{1,2}))?(?:\.(\d+))?/;
var dataF = "{1}年{2}月{3}日";
str = str.replace(reg,function(){
var args = arguments;
return dataF.replace(/\{(\d)\}/g,function($0,$1){
var ret = args[$1] ;
if(!ret){
ret = "00";
}else {
ret = ret.length<2?"0"+ret:ret;
}
return ret;
})
})
console.log(str)
测试结果: 2020年12月01日
模板换一下再执行:var dataF = "{1}年{2}月{3}日 {4}时{5}分{6}秒";
结果:2020年12月01日 08时00分01秒
换成有毫秒的亦正常执行:var dataF = "{1}年{2}月{3}日 {4}时{5}分{6}秒{7}毫秒"; var str="2020-12-1 08:00:01.112";
2020年12月01日 08时00分01秒112毫秒
打完收工!