X-Git-Url: http://git.roojs.org/?p=roojs1;a=blobdiff_plain;f=Date.js;h=0470095f7fb4ba402235a965f1a88894cae5824c;hp=365334de50cf8790b97a3eb4f20abae0fe317a2e;hb=fc32d3336ffe6a4ac93549dab21fd04b7d7056d3;hpb=0fc50850b0065dc01025fa3971cec230acc29268 diff --git a/Date.js b/Date.js index 365334de50..0470095f7f 100644 --- a/Date.js +++ b/Date.js @@ -47,7 +47,8 @@ Format Output Description H 15 24-hour format of an hour with leading zeros i 05 Minutes with leading zeros s 01 Seconds, with leading zeros - O -0600 Difference to Greenwich time (GMT) in hours + O -0600 Difference to Greenwich time (GMT) in hours (Allows +08, without minutes) + P -06:00 Difference to Greenwich time (GMT) with colon between hours and minutes T CST Timezone setting of the machine running the code Z -21600 Timezone offset in seconds (negative if west of UTC, positive if east) @@ -103,12 +104,35 @@ document.write(dt.format(Date.patterns.ShortDate)); /** Returns the number of milliseconds between this date and date @param {Date} date (optional) Defaults to now - @return {Number} The diff in milliseconds + @param {String} interval (optional) Default Date.MILLI, A valid date interval enum value (eg. Date.DAY) + @return {Number} The diff in milliseconds or units of interval @member Date getElapsed */ -Date.prototype.getElapsed = function(date) { - return Math.abs((date || new Date()).getTime()-this.getTime()); +Date.prototype.getElapsed = function(date, interval) +{ + date = date || new Date(); + var ret = Math.abs(date.getTime()-this.getTime()); + switch (interval) { + + case Date.SECOND: + return Math.floor(ret / (1000)); + case Date.MINUTE: + return Math.floor(ret / (1000*60)); + case Date.HOUR: + return Math.floor(ret / (1000*60*60)); + case Date.DAY: + return Math.floor(ret / (1000*60*60*24)); + case Date.MONTH: // this does not give exact number...?? + return ((date.format("Y") - this.format("Y")) * 12) + (date.format("m") - this.format("m")); + case Date.YEAR: // this does not give exact number...?? + return (date.format("Y") - this.format("Y")); + + case Date.MILLI: + default: + return ret; + } }; + // was in date file.. @@ -214,6 +238,8 @@ Date.getFormatCode = function(character) { return "String.leftPad(this.getSeconds(), 2, '0') + "; case "O": return "this.getGMTOffset() + "; + case "P": + return "this.getGMTColonOffset() + "; case "T": return "this.getTimezone() + "; case "Z": @@ -258,6 +284,7 @@ Date.parseDate = function(input, format) { /** * @private */ + Date.createParser = function(format) { var funcName = "parse" + Date.parseFunctions.count++; var regexNum = Date.parseRegexes.length; @@ -270,6 +297,7 @@ Date.createParser = function(format) { + "y = d.getFullYear();\n" + "m = d.getMonth();\n" + "d = d.getDate();\n" + + "if (typeof(input) !== 'string') { input = input.toString(); }\n" + "var results = input.match(Date.parseRegexes[" + regexNum + "]);\n" + "if (results && results.length > 0) {"; var regex = ""; @@ -296,17 +324,17 @@ Date.createParser = function(format) { } code += "if (y >= 0 && m >= 0 && d > 0 && h >= 0 && i >= 0 && s >= 0)\n" - + "{v = new Date(y, m, d, h, i, s);}\n" + + "{v = new Date(y, m, d, h, i, s); v.setFullYear(y);}\n" + "else if (y >= 0 && m >= 0 && d > 0 && h >= 0 && i >= 0)\n" - + "{v = new Date(y, m, d, h, i);}\n" + + "{v = new Date(y, m, d, h, i); v.setFullYear(y);}\n" + "else if (y >= 0 && m >= 0 && d > 0 && h >= 0)\n" - + "{v = new Date(y, m, d, h);}\n" + + "{v = new Date(y, m, d, h); v.setFullYear(y);}\n" + "else if (y >= 0 && m >= 0 && d > 0)\n" - + "{v = new Date(y, m, d);}\n" + + "{v = new Date(y, m, d); v.setFullYear(y);}\n" + "else if (y >= 0 && m >= 0)\n" - + "{v = new Date(y, m);}\n" + + "{v = new Date(y, m); v.setFullYear(y);}\n" + "else if (y >= 0)\n" - + "{v = new Date(y);}\n" + + "{v = new Date(y); v.setFullYear(y);}\n" + "}return (v && (z || o))?\n" // favour UTC offset over GMT offset + " ((z)? v.add(Date.SECOND, (v.getTimezoneOffset() * 60) + (z*1)) :\n" // reset to UTC, then add offset + " v.add(Date.HOUR, (v.getGMTOffset() / 100) + (o / -100))) : v\n" // reset to GMT, then add offset @@ -366,7 +394,7 @@ Date.formatCodeToRegex = function(character, currentGroup) { s:"(\\d{1,2})"}; // Numeric representation of a month, without leading zeros case "m": return {g:1, - c:"m = parseInt(results[" + currentGroup + "], 10) - 1;\n", + c:"m = Math.max(0,parseInt(results[" + currentGroup + "], 10) - 1);\n", s:"(\\d{2})"}; // Numeric representation of a month, with leading zeros case "t": return {g:0, @@ -425,6 +453,19 @@ Date.formatCodeToRegex = function(character, currentGroup) { "o = ((-12 <= (hr*60 + mn)/60) && ((hr*60 + mn)/60 <= 14))?\n", // -12hrs <= GMT offset <= 14hrs " (sn + String.leftPad(hr, 2, 0) + String.leftPad(mn, 2, 0)) : null;\n" ].join(""), + s:"([+\-]\\d{2,4})"}; + + + case "P": + return {g:1, + c:[ + "o = results[", currentGroup, "];\n", + "var sn = o.substring(0,1);\n", + "var hr = o.substring(1,3)*1 + Math.floor(o.substring(4,6) / 60);\n", + "var mn = o.substring(4,6) % 60;\n", + "o = ((-12 <= (hr*60 + mn)/60) && ((hr*60 + mn)/60 <= 14))?\n", + " (sn + String.leftPad(hr, 2, 0) + String.leftPad(mn, 2, 0)) : null;\n" + ].join(""), s:"([+\-]\\d{4})"}; case "T": return {g:0, @@ -460,6 +501,18 @@ Date.prototype.getGMTOffset = function() { + String.leftPad(this.getTimezoneOffset() % 60, 2, "0"); }; +/** + * Get the offset from GMT of the current date (equivalent to the format specifier 'P'). + * @return {String} 2-characters representing hours and 2-characters representing minutes + * seperated by a colon and prefixed with + or - (e.g. '-06:00') + */ +Date.prototype.getGMTColonOffset = function() { + return (this.getTimezoneOffset() > 0 ? "-" : "+") + + String.leftPad(Math.abs(Math.floor(this.getTimezoneOffset() / 60)), 2, "0") + + ":" + + String.leftPad(this.getTimezoneOffset() %60, 2, "0"); +} + /** * Get the numeric day number of the year, adjusted for leap year. * @return {Number} 0 through 364 (365 in leap years) @@ -674,8 +727,8 @@ Date.prototype.clearTime = function(clone){ }; // private -// safari setMonth is broken -if(Roo.isSafari){ +// safari setMonth is broken -- check that this is only donw once... +if(Roo.isSafari && typeof(Date.brokenSetMonth) == 'undefined'){ Date.brokenSetMonth = Date.prototype.setMonth; Date.prototype.setMonth = function(num){ if(num <= -1){ @@ -745,7 +798,7 @@ document.write(dt3); //returns 'Fri Oct 06 2006 07:30:00' */ Date.prototype.add = function(interval, value){ var d = this.clone(); - if (!interval || value === 0) return d; + if (!interval || value === 0) { return d; } switch(interval.toLowerCase()){ case Date.MILLI: d.setMilliseconds(this.getMilliseconds() + value); @@ -775,4 +828,4 @@ Date.prototype.add = function(interval, value){ break; } return d; -}; \ No newline at end of file +};