| // Licensed to the Apache Software Foundation (ASF) under one |
| // or more contributor license agreements. See the NOTICE file |
| // distributed with this work for additional information |
| // regarding copyright ownership. The ASF licenses this file |
| // to you under the Apache License, Version 2.0 (the |
| // "License"); you may not use this file except in compliance |
| // the License. You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, |
| // software distributed under the License is distributed on an |
| // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| // KIND, either express or implied. See the License for the |
| // specific language governing permissions and limitations |
| // under the License. |
| Date.prototype.setISO8601 = function(dString){ |
| |
| var regexp = /(\d\d\d\d)(-)?(\d\d)(-)?(\d\d)(T)?(\d\d)(:)?(\d\d)(:)?(\d\d)(\.\d+)?(Z|([+-])(\d\d)(:)?(\d\d))/; |
| |
| if (dString.toString().match(new RegExp(regexp))) { |
| var d = dString.match(new RegExp(regexp)); |
| var offset = 0; |
| |
| this.setUTCDate(1); |
| this.setUTCFullYear(parseInt(d[1],10)); |
| this.setUTCMonth(parseInt(d[3],10) - 1); |
| this.setUTCDate(parseInt(d[5],10)); |
| this.setUTCHours(parseInt(d[7],10)); |
| this.setUTCMinutes(parseInt(d[9],10)); |
| this.setUTCSeconds(parseInt(d[11],10)); |
| if (d[12]) |
| this.setUTCMilliseconds(parseFloat(d[12]) * 1000); |
| else |
| this.setUTCMilliseconds(0); |
| if (d[13] != 'Z') { |
| offset = (d[15] * 60) + parseInt(d[17],10); |
| offset *= ((d[14] == '-') ? -1 : 1); |
| this.setTime(this.getTime() - offset * 60 * 1000); |
| } |
| } |
| else { |
| this.setTime(Date.parse(dString)); |
| } |
| return this; |
| }; |
| |
| //***** vmops (begin) *************************************************************** |
| |
| /* |
| This is a hack/temporary solution that lacks calculation of Daylight Saving Time. |
| We'll fix the problem by getting datetime in a specified timezone (including Daylight Saving Time) from server-side in next release. |
| */ |
| Date.prototype.getTimePlusTimezoneOffset = function(timezoneOffset) { |
| var milliseconds = this.getTime(); |
| var s1 = new Date(milliseconds + (timezoneOffset * 60 * 60 * 1000)).toUTCString(); //e.g. "Tue, 08 Jun 2010 19:13:49 GMT", "Tue, 25 May 2010 12:07:01 UTC" |
| var s2 = s1.substring(s1.indexOf(", ")+2); //e.g. "08 Jun 2010 19:13:49 GMT", "25 May 2010 12:07:01 UTC" |
| var s3 = s2.substring(0,s2.length-4); //e.g. "08 Jun 2010 19:13:49", "25 May 2010 12:10:16" |
| return s3; |
| } |
| |
| //***** vmops (end) ***************************************************************** |
| |
| Date.prototype.format = function(format) { |
| var returnStr = ''; |
| var replace = Date.replaceChars; |
| for (var i = 0; i < format.length; i++) { |
| var curChar = format.charAt(i); |
| if (replace[curChar]) { |
| returnStr += replace[curChar].call(this); |
| } else { |
| returnStr += curChar; |
| } |
| } |
| return returnStr; |
| }; |
| Date.replaceChars = { |
| shortMonths: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], |
| longMonths: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], |
| shortDays: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], |
| longDays: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], |
| |
| // Day |
| d: function() { return (this.getDate() < 10 ? '0' : '') + this.getDate(); }, |
| D: function() { return Date.replaceChars.shortDays[this.getDay()]; }, |
| j: function() { return this.getDate(); }, |
| l: function() { return Date.replaceChars.longDays[this.getDay()]; }, |
| N: function() { return this.getDay() + 1; }, |
| S: function() { return (this.getDate() % 10 == 1 && this.getDate() != 11 ? 'st' : (this.getDate() % 10 == 2 && this.getDate() != 12 ? 'nd' : (this.getDate() % 10 == 3 && this.getDate() != 13 ? 'rd' : 'th'))); }, |
| w: function() { return this.getDay(); }, |
| z: function() { return "Not Yet Supported"; }, |
| // Week |
| W: function() { return "Not Yet Supported"; }, |
| // Month |
| F: function() { return Date.replaceChars.longMonths[this.getMonth()]; }, |
| m: function() { return (this.getMonth() < 9 ? '0' : '') + (this.getMonth() + 1); }, |
| M: function() { return Date.replaceChars.shortMonths[this.getMonth()]; }, |
| n: function() { return this.getMonth() + 1; }, |
| t: function() { return "Not Yet Supported"; }, |
| // Year |
| L: function() { return "Not Yet Supported"; }, |
| o: function() { return "Not Supported"; }, |
| Y: function() { return this.getFullYear(); }, |
| y: function() { return ('' + this.getFullYear()).substr(2); }, |
| // Time |
| a: function() { return this.getHours() < 12 ? 'am' : 'pm'; }, |
| A: function() { return this.getHours() < 12 ? 'AM' : 'PM'; }, |
| B: function() { return "Not Yet Supported"; }, |
| g: function() { return this.getHours() % 12 || 12; }, |
| G: function() { return this.getHours(); }, |
| h: function() { return ((this.getHours() % 12 || 12) < 10 ? '0' : '') + (this.getHours() % 12 || 12); }, |
| H: function() { return (this.getHours() < 10 ? '0' : '') + this.getHours(); }, |
| i: function() { return (this.getMinutes() < 10 ? '0' : '') + this.getMinutes(); }, |
| s: function() { return (this.getSeconds() < 10 ? '0' : '') + this.getSeconds(); }, |
| // Timezone |
| e: function() { return "Not Yet Supported"; }, |
| I: function() { return "Not Supported"; }, |
| O: function() { return (-this.getTimezoneOffset() < 0 ? '-' : '+') + (Math.abs(this.getTimezoneOffset() / 60) < 10 ? '0' : '') + (Math.abs(this.getTimezoneOffset() / 60)) + '00'; }, |
| T: function() { var m = this.getMonth(); this.setMonth(0); var result = this.toTimeString().replace(/^.+ \(?([^\)]+)\)?$/, '$1'); this.setMonth(m); return result;}, |
| Z: function() { return -this.getTimezoneOffset() * 60; }, |
| // Full Date/Time |
| c: function() { return "Not Yet Supported"; }, |
| r: function() { return this.toString(); }, |
| U: function() { return this.getTime() / 1000; } |
| }; |