日付解析関数

2508 ワード

半製品です.間に合わせてください.

function parseDate(str,fm){
    var start = 0,ch1 = null,ch2 = null;
    var chReg = /^[yMdhms]$/,
      nReg = /^\d$/;
    str = str.replace(/^\s+/g,'').replace(/\s+$/,'');
    fm = fm.replace(/^\s+/g,'').replace(/\s+$/,'');
    if(str.length !== fm.length){
        return null;
    }

    var dtArr = [];
    function convert(start,end){
      var tmp = parseInt(str.substring(start,end),10);
            switch(ch1){
                case 'y' : dtArr[0] = tmp;break;
                case 'M' : dtArr[1] = tmp - 1;break;
                case 'd' : dtArr[2] = tmp;break;
                case 'h' : dtArr[3] = tmp;break;
                case 'm' : dtArr[4] = tmp;break;
                case 's' : dtArr[5] = tmp;break;
                default:  throw new Error("Invalid Date.");
            }
    }

    ch1 = fm.charAt(i);
    var flag = true;//        
    try{
      for(var i = 0,len = fm.length; i < len; i++){
          ch2 = fm.charAt(i);
          if(chReg.test(ch2) && nReg.test(str.charAt(i))){//      
              if(ch2 === ch1){
                  continue;
              }else{//    
                  ch1 = ch2;
                  if(flag){
                    convert(start,i);
                  }
                  flag = true;
                  start  = i;
              }
          }else if(ch2 === str.charAt(i)){
            if(flag){
              convert(start,i);
            }else{
              start  = i;
            }
            flag = false;
          }else{
            throw new Error('format no match.');
          }
      }
      convert(start,i);
    }catch(e){
      console.error(e);
      return null;
    }
    
    return new Date(dtArr[0],dtArr[1],dtArr[2],dtArr[3]||0,dtArr[4]||0,dtArr[5]||0,0);
}

usage:
console.log(parseDate('2014-11-08','yyyy-MM-dd'));
									console.log(parseDate('2014-02-08 22:22:12','yyyy-MM-dd hh:mm:ss'));
									console.log(parseDate('31/01/2011','dd/MM/yyyy'));