/**
* 说明:时间戳的格式化、时间字符转时间戳
* y:年 m:月 d:日 h:时 i:分 s:秒 l:毫秒(mill)
* w:数字星期 WE:英文星期 WC:中文星期
* m:数字月份 M:英文月份
*/
var Time={
D:{y:1970,m:"01",d:"01",h:"00",i:"00",s:"00",l:"00"},//必要的模板和默认值
F:['y','m','d','h','i','s','l','M','WC','WE'],//格式模板
M:['','Jan','Feb','Mar','Apr','May','Jun',
'Jul','Aug','Sep','Oct','Nov','Dec'],
WC:['日','一','二','三','四','五','六'],
WE:['Sun','Mon','Tue','Wed','Thu','Fri','Sat']
,// 将时间戳格式化。参数:时间戳 格式模板 数字是否补位
f:function (n,fm,b){
var i,t=new Date(n),w=t.getDay(),fmt=Object.keys(this.D)
n=t.toISOString().match(/\d+/g)
if(b){
for(i in fmt) fm=fm.split(fmt[i]).join(n[i])
}else{
for(i in fmt) fm=fm.split(fmt[i]).join(parseInt(n[i]))
}
fm=fm.split('w').join(w).split('WC').join(this.WC[w])
fm=fm.split('M').join(this.M[parseInt(n[1])])
return fm.split('WE').join(this.WE[w])
}
,// 将 时间字符串 按模板(不匹配返回null)解析,还原成时间戳
re:function (s,fm){
var i,p,t=this.F,pos={}
// 获取所有匹配字符串 在模板中的 全部索引
for(i in t){
p=fm.indexOf(t[i])
while(p>=0){
pos[p]=t[i]
p=fm.indexOf(t[i],p+t[i].length)
}
}
// 规律:按顺序排列后,上个元素末尾 到 下个元素开头 之间的字符串相同。因此,先获取所有间隔符
var p=Object.keys(pos),gap={}
p.push(fm.length)
for(i=p.length-2;i>=0;i--){
t=p[i]-0
gap[t]=fm.substring(t+pos[t].length,p[i+1])
}
// 截取时间数据:将模板字符作为键名,顺便去重
s=s.substr(p[0]),t={}
for(i in gap){
p=s.indexOf(gap[i],1)
if(p>=0){
t[pos[i]]=s.substring(0,p)
s=s.substr(p+gap[i].length)
}else return null;//如果格式不匹配,返回null
}
// 月份英文和数字只读取一个
if(!t["m"] && t["M"]) t["m"]=this.M.indexOf(t["M"])
// 如果没有,则设为默认值,且保证至少两位
for(i in this.D){
if(!t[i]) t[i]=this.D[i]
else if(t[i].length<2) t[i]='0'+t[i]
}
//根据模板设置成ISO格式,才能获取毫秒
t=t.y+'-'+t.m+'-'+t.d+'T'+t.h+':'+t.i+':'+t.s+'.'+t.u+'Z'
return new Date(t).valueOf()
}
}
JS的时间戳与时间字符串的相互转换
最新推荐文章于 2022-07-08 13:52:19 发布