JS的时间戳与时间字符串的相互转换

/**
 * 说明:时间戳的格式化、时间字符转时间戳
 * 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()
}
}

你可能感兴趣的:(笔记)