领星动网编程开发之爆炸小宇宙

cnitblog.com/lxasp - - 有一种信念叫做编程
posts - 54, comments - 34, trackbacks - 0, articles - 0

整理了一份日期时间字符串格式化的JS代码

Posted on 2009-09-01 15:05 lxasp 阅读(2766) 评论(4)  编辑 收藏 引用 所属分类: AJAX
/**
 * Date Text String Format / Convert
 * 1:10 2009-9-1 www.lxasp.com
 * 
 * RIP and MOD from :
 * www.dynarch.com/projects/calendar
 * http://www.blogjava.net/rox/archive/2009/01/23/249031.html
 * 
 * add support year from 0 to 9999 when use "yyyy" or "%Y"
 * 
 
*/
(
function() {
        
datetext 
= {};

datetext.isDate 
=function(v){
    
return(typeof v!="object"? false : (v.constructor==Date) ? !isNaN(v) : false;
}

datetext.toDate 
= function(str, fmt, isjoin) {

    
var getDate = function(dateString, formatString){

        
var y4 = "([0-9]{4})",
        y2 
= "([0-9]{2})",
        yi 
= -1,
        M2 
= "(0[1-9]|1[0-2])",
        M1 
= "([1-9]|1[0-2])",
        Mi 
= -1,
        d2 
= "(0[1-9]|[1-2][0-9]|30|31)",
        d1 
= "([1-9]|[1-2][0-9]|30|31)",
        di 
= -1,
        H2 
= "([0-1][0-9]|20|21|22|23)",
        H1 
= "([0-9]|1[0-9]|20|21|22|23)",
        Hi 
= -1,
        m2 
= "([0-5][0-9])",
        m1 
= "([0-9]|[1-5][0-9])",
        mi 
= -1,
        s2 
= "([0-5][0-9])",
        s1 
= "([0-9]|[1-5][0-9])",
        si 
= -1,
        regexp;

        
var validateDate = function(dateString, formatString){
          
if(dateString==""return;
          
var reg    =    formatString;
          reg    
=    reg.replace(/yyyy/, y4);
          reg    
=    reg.replace(/yy/, y2);
          reg    
=    reg.replace(/mm/, M2);
          reg    
=    reg.replace(/m/, M1);
          reg    
=    reg.replace(/dd/, d2);
          reg    
=    reg.replace(/d/, d1);
          reg    
=    reg.replace(/HH/, H2);
          reg    
=    reg.replace(/H/, H1);
          reg    
=    reg.replace(/MM/, m2);
          reg    
=    reg.replace(/M/, m1);
          reg    
=    reg.replace(/SS/, s2);
          reg    
=    reg.replace(/S/, s1);
          reg    
=    new RegExp("^"+reg+"$");
          regexp 
= reg;
          
return reg.test(dateString);
        },
        validateIndex 
=function(formatString){
          
          
var ia = new Array();
          
var i = 0;
          yi    
=    formatString.search(/yyyy/);
          
if ( yi < 0 ) yi = formatString.search(/yy/);
          
if (yi >= 0) {
            ia[i] 
= yi;
            i
++;
          }

          Mi    
=    formatString.search(/mm/);
          
if ( Mi < 0 ) Mi = formatString.search(/m/);
          
if (Mi >= 0) {
            ia[i] 
= Mi;
            i
++;
          }

          di    
=    formatString.search(/dd/);
          
if ( di < 0 ) di = formatString.search(/d/);
          
if (di >= 0) {
            ia[i] 
= di;
            i
++;
          }

          Hi    
=    formatString.search(/HH/);
          
if ( Hi < 0 ) Hi = formatString.search(/H/);
          
if (Hi >= 0) {
            ia[i] 
= Hi;
            i
++;
          }

          mi    
=    formatString.search(/MM/);
          
if ( mi < 0 ) mi = formatString.search(/M/);
          
if (mi >= 0) {
            ia[i] 
= mi;
            i
++;
          }

          si    
=    formatString.search(/SS/);
          
if ( si < 0 ) si = formatString.search(/S/);
          
if (si >= 0) {
            ia[i] 
= si;
            i
++;
          }

          
var ia2 = new Array(yi, Mi, di, Hi, mi, si);

          
for(i=0; i<ia.length-1; i++
            
for(j=0;j<ia.length-1-i;j++
                
if(ia[j]>ia[j+1]) {
                    temp
=ia[j]; 
                    ia[j]
=ia[j+1]; 
                    ia[j
+1]=temp;
                }

          
for (i=0; i<ia.length ; i++)
            
for (j=0; j<ia2.length; j++)
              
if(ia[i]==ia2[j]) {
                ia2[j] 
= i;
              }
          
          
return ia2;
        };

      
if(validateDate(dateString, formatString)) {
        
var now = new Date(),
        vals 
= regexp.exec(dateString),
        index 
= validateIndex(formatString),
        year 
= index[0]>=0?vals[index[0+ 1]:now.getFullYear(),
        month 
= index[1]>=0?(vals[index[1+ 1]-1):now.getMonth(),
        day 
= index[2]>=0?vals[index[2+ 1]:now.getDate(),
        hour 
= index[3]>=0?vals[index[3+ 1]:"",
        minute 
= index[4]>=0?vals[index[4+ 1]:"",
        second 
= index[5]>=0?vals[index[5+ 1]:"",
        validate;

        
if (hour == "")
          validate 
= new Date(year, month, day);
        
else
          validate 
= new Date(year, month, day, hour, minute, second);
        
        
if(!datetext.isDate(validate)) return new Date();
        
        
if(formatString.search(/yyyy/)<0){
            
var y = year;
            y
=parseInt( ('' + y).length==4 ? ('' + y).substr(22) : (''+y).length==2 ? y : '0'+y ,10) ;
            (y 
< 100&& (y += (y > 29? 1900 : 2000);
            validate.setFullYear(y);
        }
else{validate.setFullYear(year);}

        
if(validate.getDate()==day) return validate;

      }
      
return new Date();
    };
    
    
    
if(isjoin)return getDate(str,fmt);
    
    
var today = new Date(), ret,
    y 
= 0,
    m 
= -1,
    d 
= 0,
    a 
= str.split(/\W+/),
    b 
= fmt.match(/%./g),
    i 
= 0, j = 0,
    hr 
= 0,
    min 
= 0,sec=0;
    
for (i = 0; i < a.length; ++i) {
        
if (!a[i])
            
continue;
        
switch (b[i]) {
            
case "%d":
            
case "%e":
            d 
= parseInt(a[i], 10);
            
break;

            
case "%m":
            m 
= parseInt(a[i], 10- 1;
            
break;

            
case "%Y":
            y 
= parseInt(a[i], 10);
            
break;
            
case "%y":
            y 
= parseInt(a[i], 10);
            (y 
< 100&& (y += (y > 29? 1900 : 2000);
            
break;

            
case "%b":
            
case "%B":
            
for (j = 0; j < 12++j) {
                
if (datetext._MN[j].substr(0, a[i].length).toLowerCase() == a[i].toLowerCase()) { m = j; break; }
            }
            
break;

            
case "%H":
            
case "%I":
            
case "%k":
            
case "%l":
            hr 
= parseInt(a[i], 10);
            
break;

            
case "%P":
            
case "%p":
            
if (/pm/i.test(a[i]) && hr < 12)
                hr 
+= 12;
            
else if (/am/i.test(a[i]) && hr >= 12)
                hr 
-= 12;
            
break;

            
case "%M":
            min 
= parseInt(a[i], 10);
            
break;

            
case "%S":
            sec 
= parseInt(a[i], 10);
            
break;

        }
    }
    
if (isNaN(y)) y = today.getFullYear();
    
if (isNaN(m)) m = today.getMonth();
    
if (isNaN(d)) d = today.getDate();
    
if (isNaN(hr)) hr = today.getHours();
    
if (isNaN(min)) min = today.getMinutes();
    
if (isNaN(sec)) sec = today.getSeconds();
    
if (y != 0 && m != -1 && d != 0){
        ret
=new Date(y, m, d, hr, min, sec);
        
if(datetext.isDate(ret)){
            ret.setFullYear(y);
return ret;
        }
else{return today}
    }
    y 
= 0; m = -1; d = 0;
    
for (i = 0; i < a.length; ++i) {
        
if (a[i].search(/[a-zA-Z]+/!= -1) {
            
var t = -1;
            
for (j = 0; j < 12++j) {
                
if (datetext._MN[j].substr(0, a[i].length).toLowerCase() == a[i].toLowerCase()) { t = j; break; }
            }
            
if (t != -1) {
                
if (m != -1) {
                    d 
= m+1;
                }
                m 
= t;
            }
        } 
else if (parseInt(a[i], 10<= 12 && m == -1) {
            m 
= a[i]-1;
        } 
else if (parseInt(a[i], 10> 31 && y == 0) {
            y 
= parseInt(a[i], 10);
            (y 
< 100&& (y += (y > 29? 1900 : 2000);
        } 
else if (d == 0) {
            d 
= a[i];
        }
    }
    
if (y == 0)
        y 
= today.getFullYear();
    
if (m != -1 && d != 0){
        ret
=new Date(y, m, d, hr, min, sec);
        
if(datetext.isDate(ret)){
            ret.setFullYear(y);
return ret;
        }
else{return today}
    }
    
return today;
};


/** Returns the number of day in the year. */
datetext.getDayOfYear 
= function(self) {
    
var SECOND = 1000,
        MINUTE 
= 60 *     SECOND,
        HOUR   
= 60 *     MINUTE,
        DAY    
= 24 *     HOUR,
        WEEK   
=  7 *     DAY;
    
var now = new Date(self.getFullYear(), self.getMonth(), self.getDate(), 000);
    now.setFullYear(self.getFullYear());
    
var then = new Date(self.getFullYear(), 00000);
    then.setFullYear(self.getFullYear());
    
var time = now - then;
    
return Math.floor(time / DAY);
};

/** Returns the number of the week in year, as defined in ISO 8601. */
datetext.getWeekNumber 
= function(self) {
    
var d = new Date(self.getFullYear(), self.getMonth(), self.getDate(), 000);
    d.setFullYear(self.getFullYear());
    
var DoW = d.getDay();
    d.setDate(d.getDate() 
- (DoW + 6% 7 + 3); // Nearest Thu
    var ms = d.valueOf(); // GMT
    d.setMonth(0);
    d.setDate(
4); // Thu in Week 1
    return Math.round((ms - d.valueOf()) / (7 * 864e5)) + 1;
};


/** Prints the date in a string according to the given format. */
datetext.toText 
= function (self,str) {

/// detect a s