/** * Date utilities */ define(function () { 'use strict'; var DateHelper = { isValid: function(dateStr, format){ if(!format) { format = 'DMY'; } format = format.toUpperCase(); if(format.length != 3) { if(format==='DDMMMYYYY'){ var d = this.format(dateStr, format); dateStr = d.getDate() +'/'+ (d.getMonth()+1) +'/'+ d.getFullYear(); format = 'DMY'; } } if((format.indexOf('M') === -1) || (format.indexOf('D') === -1) || (format.indexOf('Y') === -1)){ format = 'DMY'; } var reg1, reg2; // If the year is first if(format.substring(0, 1) == 'Y') { reg1 = /^\d{2}(\-|\/|\.)\d{1,2}\1\d{1,2}$/; reg2 = /^\d{4}(\-|\/|\.)\d{1,2}\1\d{1,2}$/; } else if(format.substring(1, 2) == 'Y') { // If the year is second reg1 = /^\d{1,2}(\-|\/|\.)\d{2}\1\d{1,2}$/; reg2 = /^\d{1,2}(\-|\/|\.)\d{4}\1\d{1,2}$/; } else { // The year must be third reg1 = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{2}$/; reg2 = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/; } // If it doesn't conform to the right format (with either a 2 digit year or // 4 digit year), fail if(reg1.test(dateStr) === false && reg2.test(dateStr) === false) { return false; } // Split into 3 parts based on what the divider was var parts = dateStr.split(RegExp.$1); var mm, dd, yy; // Check to see if the 3 parts end up making a valid date if(format.substring(0, 1) === 'M'){ mm = parts[0]; } else if(format.substring(1, 2) === 'M'){ mm = parts[1]; } else { mm = parts[2]; } if(format.substring(0, 1) === 'D'){ dd = parts[0]; } else if(format.substring(1, 2) === 'D'){ dd = parts[1]; } else { dd = parts[2]; } if(format.substring(0, 1) === 'Y'){ yy = parts[0]; } else if(format.substring(1, 2) === 'Y'){ yy = parts[1]; } else { yy = parts[2]; } if(parseInt(yy, 10) <= 50){ yy = (parseInt(yy, 10) + 2000).toString(); } if(parseInt(yy, 10) <= 99){ yy = (parseInt(yy, 10) + 1900).toString(); } var dt = new Date( parseInt(yy, 10), parseInt(mm, 10)-1, parseInt(dd, 10), 0, 0, 0, 0); if(parseInt(dd, 10) != dt.getDate()){ return false; } if(parseInt(mm, 10)-1 != dt.getMonth()){ return false; } return true; }, format: function(dateStr, format){ if(!format){ format = 'DMY'; } if(!dateStr || dateStr === ''){ return new Date(1001, 0, 1); } var oDate, parts; function y2kDate(yr){ if(yr === undefined){ return 0; } if(yr.length>2){ return yr; } var y; //>50 belong to 1900 if(yr <= 99 && yr>50){ y = '19' + yr; } //<50 belong to 2000 if(yr<50 || yr === '00'){ y = '20' + yr; } return y; } function mmm2mm(mmm){ if(mmm === undefined){ return 0; } var mondigit; var MONTH_NAMES = [ 'january','february','march','april','may','june','july', 'august','september','october','november','december', 'jan','feb','mar','apr','may','jun','jul','aug','sep','oct', 'nov','dec' ]; for(var m_i=0; m_i < MONTH_NAMES.length; m_i++){ var month_name = MONTH_NAMES[m_i]; if (mmm.toLowerCase() === month_name){ mondigit = m_i+1; break; } } if(mondigit > 11 || mondigit < 23){ mondigit = mondigit - 12; } if(mondigit < 1 || mondigit > 12){ return 0; } return mondigit; } switch(format.toUpperCase()){ case 'DDMMMYYYY': parts = dateStr.replace(/[- \/.]/g,' ').split(' '); oDate = new Date(y2kDate(parts[2]),mmm2mm(parts[1])-1,parts[0]); break; case 'DMY': parts = dateStr.replace( /^(0?[1-9]|[12][0-9]|3[01])([- \/.])(0?[1-9]|1[012])([- \/.])((\d\d)?\d\d)$/,'$1 $3 $5').split(' '); oDate = new Date(y2kDate(parts[2]),parts[1]-1,parts[0]); break; case 'MDY': parts = dateStr.replace( /^(0?[1-9]|1[012])([- \/.])(0?[1-9]|[12][0-9]|3[01])([- \/.])((\d\d)?\d\d)$/,'$1 $3 $5').split(' '); oDate = new Date(y2kDate(parts[2]),parts[0]-1,parts[1]); break; case 'YMD': parts = dateStr.replace(/^((\d\d)?\d\d)([- \/.])(0?[1-9]|1[012])([- \/.])(0?[1-9]|[12][0-9]|3[01])$/,'$1 $4 $6').split(' '); oDate = new Date(y2kDate(parts[0]),parts[1]-1,parts[2]); break; default: //in case format is not correct parts = dateStr.replace(/^(0?[1-9]|[12][0-9]|3[01])([- \/.])(0?[1-9]|1[012])([- \/.])((\d\d)?\d\d)$/,'$1 $3 $5').split(' '); oDate = new Date(y2kDate(parts[2]),parts[1]-1,parts[0]); break; } return oDate; } }; return DateHelper; });