Changeset 12198

Show
Ignore:
Timestamp:
01/29/08 11:20:29 (12 months ago)
Author:
peller
Message:

build the Date object at the end, not as we go along. The setters on Date seem to have a bunch of issues. Calling the Date constructor once is more reliable and probably more performant. Also, use 1970 as the default year. Fixes #5716, #5680

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • dojo/trunk/date/locale.js

    r12188 r12198  
    292292 
    293293        var widthList = ['abbr', 'wide', 'narrow']; 
    294         //1972 is a leap year.  We want to avoid Feb 29 rolling over into Mar 1, 
    295         //in the cases where the year is parsed after the month and day. 
    296         var result = new Date(1972, 0); 
     294        var result = [1970,0,1,0,0,0,0]; // will get converted to a Date at the end 
    297295        var expected = {}; 
    298296        var amPm = ""; 
     
    305303                                if(l != 2 && options.strict){ 
    306304                                        //interpret year literally, so '5' would be 5 A.D. 
    307                                         result.setFullYear(v); 
     305                                        result[0] = v; 
    308306                                        expected.year = v; 
    309307                                }else{ 
     
    314312                                                var year = '' + new Date().getFullYear(); 
    315313                                                var century = year.substring(0, 2) * 100; 
    316                                                 var yearPart = Number(year.substring(2, 4)); 
    317                                                 var cutoff = Math.min(yearPart + 20, 99); 
     314                                                var cutoff = Math.min(Number(year.substring(2, 4)) + 20, 99); 
    318315                                                var num = (v < cutoff) ? century + v : century - 100 + v; 
    319                                                 result.setFullYear(num); 
     316                                                result[0] = num; 
    320317                                                expected.year = num; 
    321318                                        }else{ 
     
    326323                                                //interpret literally, so '150' would be 150 A.D. 
    327324                                                //also tolerate '1950', if 'yyyy' input passed to 'yy' format 
    328                                                 result.setFullYear(v); 
     325                                                result[0] = v; 
    329326                                                expected.year = v; 
    330327                                        } 
     
    348345                                        v--; 
    349346                                } 
    350                                 result.setMonth(v); 
     347                                result[1] = v; 
    351348                                expected.month = v; 
    352349                                break; 
     
    371368                                break; 
    372369                        case 'd': 
    373                                 result.setDate(v); 
     370                                result[2] = v; 
    374371                                expected.date = v; 
    375372                                break; 
    376373                        case 'D': 
    377                                 //FIXME: need to defer this until after the year is set for leap-year? 
    378                                 result.setMonth(0); 
    379                                 result.setDate(v); 
     374                                result[1] = 0; 
     375                                result[2] = v; 
    380376                                break; 
    381377                        case 'a': //am/pm 
     
    410406                                //in the 12-hour case, adjusting for am/pm requires the 'a' part 
    411407                                //which could come before or after the hour, so we will adjust later 
    412                                 result.setHours(v); 
     408                                result[3] =v; 
    413409                                break; 
    414410                        case 'm': //minutes 
    415                                 result.setMinutes(v); 
     411                                result[4] = v; 
    416412                                break; 
    417413                        case 's': //seconds 
    418                                 result.setSeconds(v); 
     414                                result[5] = v; 
    419415                                break; 
    420416                        case 'S': //milliseconds 
    421                                 result.setMilliseconds(v); 
     417                                result[6] = v; 
    422418//                              break; 
    423419//                      case 'w': 
     
    430426        }); 
    431427 
    432         //validate parse date fields versus input date fields 
    433         if(!valid || 
    434                 (expected.year && result.getFullYear() != expected.year) || 
    435                 (expected.month && result.getMonth() != expected.month) || 
    436                 (expected.date && result.getDate() != expected.date)){ 
    437                 return null; 
    438         } 
    439  
    440         var hours = result.getHours(); 
     428        var hours = result[3]; 
    441429        if(amPm === 'p' && hours < 12){ 
    442                 result.setHours(hours + 12); //e.g., 3pm -> 15 
     430                result[3] = hours + 12; //e.g., 3pm -> 15 
    443431        }else if(amPm === 'a' && hours == 12){ 
    444                 result.setHours(0); //12am -> 0 
     432                result[3] = 0; //12am -> 0 
    445433        } 
    446434 
    447435        //TODO: implement a getWeekday() method in order to test  
    448436        //validity of input strings containing 'EEE' or 'EEEE'... 
    449         return result; // Date 
     437 
     438        var dateObject = new Date(result[0], result[1], result[2], result[3], result[4], result[5], result[6]); // Date 
     439 
     440        // Do some bounds checking.  The Date() constructor normalizes things like April 32nd... 
     441        //TODO: why isn't this done for times as well? 
     442        if(!valid || 
     443                (expected.year && dateObject.getFullYear() != result[0]) || 
     444                (expected.month && dateObject.getMonth() != result[1]) || 
     445                (expected.date && dateObject.getDate() != result[2])){ 
     446                return null; 
     447        } 
     448 
     449        return dateObject; // Date 
    450450}; 
    451451