Changeset 7151 for branches/2.4/prototype/plugins/datejs/core-debug.js
- Timestamp:
- 09/03/12 18:05:54 (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2.4/prototype/plugins/datejs/core-debug.js
r5341 r7151 1 1 /** 2 * Version: 1.0 Alpha-1 3 * Build Date: 12-Nov-2007 4 * Copyright (c) 2006-2007, Coolite Inc. (http://www.coolite.com/). All rights reserved. 5 * License: Licensed under The MIT License. See license.txt and http://www.datejs.com/license/. 6 * Website: http://www.datejs.com/ or http://www.coolite.com/datejs/ 2 * @version: 1.0 Alpha-1 3 * @author: Coolite Inc. http://www.coolite.com/ 4 * @date: 2008-04-13 5 * @copyright: Copyright (c) 2006-2008, Coolite Inc. (http://www.coolite.com/). All rights reserved. 6 * @license: Licensed under The MIT License. See license.txt and http://www.datejs.com/license/. 7 * @website: http://www.datejs.com/ 7 8 */ 8 9 /** 10 * Gets the month number (0-11) if given a Culture Info specific string which is a valid monthName or abbreviatedMonthName. 11 * @param {String} The name of the month (eg. "February, "Feb", "october", "oct"). 12 * @return {Number} The day number 13 */ 14 Date.getMonthNumberFromName = function (name) { 15 var n = Date.CultureInfo.monthNames, m = Date.CultureInfo.abbreviatedMonthNames, s = name.toLowerCase(); 16 for (var i = 0; i < n.length; i++) { 17 if (n[i].toLowerCase() == s || m[i].toLowerCase() == s) { 18 return i; 19 } 9 10 (function () { 11 var $D = Date, 12 $P = $D.prototype, 13 $C = $D.CultureInfo, 14 p = function (s, l) { 15 if (!l) { 16 l = 2; 17 } 18 return ("000" + s).slice(l * -1); 19 }; 20 21 /** 22 * Resets the time of this Date object to 12:00 AM (00:00), which is the start of the day. 23 * @param {Boolean} .clone() this date instance before clearing Time 24 * @return {Date} this 25 */ 26 $P.clearTime = function () { 27 this.setHours(0); 28 this.setMinutes(0); 29 this.setSeconds(0); 30 this.setMilliseconds(0); 31 return this; 32 }; 33 34 /** 35 * Resets the time of this Date object to the current time ('now'). 36 * @return {Date} this 37 */ 38 $P.setTimeToNow = function () { 39 var n = new Date(); 40 this.setHours(n.getHours()); 41 this.setMinutes(n.getMinutes()); 42 this.setSeconds(n.getSeconds()); 43 this.setMilliseconds(n.getMilliseconds()); 44 return this; 45 }; 46 47 /** 48 * Gets a date that is set to the current date. The time is set to the start of the day (00:00 or 12:00 AM). 49 * @return {Date} The current date. 50 */ 51 $D.today = function () { 52 return new Date().clearTime(); 53 }; 54 55 /** 56 * Compares the first date to the second date and returns an number indication of their relative values. 57 * @param {Date} First Date object to compare [Required]. 58 * @param {Date} Second Date object to compare to [Required]. 59 * @return {Number} -1 = date1 is lessthan date2. 0 = values are equal. 1 = date1 is greaterthan date2. 60 */ 61 $D.compare = function (date1, date2) { 62 if (isNaN(date1) || isNaN(date2)) { 63 throw new Error(date1 + " - " + date2); 64 } else if (date1 instanceof Date && date2 instanceof Date) { 65 return (date1 < date2) ? -1 : (date1 > date2) ? 1 : 0; 66 } else { 67 throw new TypeError(date1 + " - " + date2); 68 } 69 }; 70 71 /** 72 * Compares the first Date object to the second Date object and returns true if they are equal. 73 * @param {Date} First Date object to compare [Required] 74 * @param {Date} Second Date object to compare to [Required] 75 * @return {Boolean} true if dates are equal. false if they are not equal. 76 */ 77 $D.equals = function (date1, date2) { 78 return (date1.compareTo(date2) === 0); 79 }; 80 81 /** 82 * Gets the day number (0-6) if given a CultureInfo specific string which is a valid dayName, abbreviatedDayName or shortestDayName (two char). 83 * @param {String} The name of the day (eg. "Monday, "Mon", "tuesday", "tue", "We", "we"). 84 * @return {Number} The day number 85 */ 86 $D.getDayNumberFromName = function (name) { 87 var n = $C.dayNames, m = $C.abbreviatedDayNames, o = $C.shortestDayNames, s = name.toLowerCase(); 88 for (var i = 0; i < n.length; i++) { 89 if (n[i].toLowerCase() == s || m[i].toLowerCase() == s || o[i].toLowerCase() == s) { 90 return i; 91 } 92 } 93 return -1; 94 }; 95 96 /** 97 * Gets the month number (0-11) if given a Culture Info specific string which is a valid monthName or abbreviatedMonthName. 98 * @param {String} The name of the month (eg. "February, "Feb", "october", "oct"). 99 * @return {Number} The day number 100 */ 101 $D.getMonthNumberFromName = function (name) { 102 var n = $C.monthNames, m = $C.abbreviatedMonthNames, s = name.toLowerCase(); 103 for (var i = 0; i < n.length; i++) { 104 if (n[i].toLowerCase() == s || m[i].toLowerCase() == s) { 105 return i; 106 } 107 } 108 return -1; 109 }; 110 111 /** 112 * Determines if the current date instance is within a LeapYear. 113 * @param {Number} The year. 114 * @return {Boolean} true if date is within a LeapYear, otherwise false. 115 */ 116 $D.isLeapYear = function (year) { 117 return ((year % 4 === 0 && year % 100 !== 0) || year % 400 === 0); 118 }; 119 120 /** 121 * Gets the number of days in the month, given a year and month value. Automatically corrects for LeapYear. 122 * @param {Number} The year. 123 * @param {Number} The month (0-11). 124 * @return {Number} The number of days in the month. 125 */ 126 $D.getDaysInMonth = function (year, month) { 127 return [31, ($D.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month]; 128 }; 129 130 $D.getTimezoneAbbreviation = function (offset) { 131 var z = $C.timezones, p; 132 for (var i = 0; i < z.length; i++) { 133 if (z[i].offset === offset) { 134 return z[i].name; 135 } 136 } 137 return null; 138 }; 139 140 $D.getTimezoneOffset = function (name) { 141 var z = $C.timezones, p; 142 for (var i = 0; i < z.length; i++) { 143 if (z[i].name === name.toUpperCase()) { 144 return z[i].offset; 145 } 146 } 147 return null; 148 }; 149 150 /** 151 * Returns a new Date object that is an exact date and time copy of the original instance. 152 * @return {Date} A new Date instance 153 */ 154 $P.clone = function () { 155 return new Date(this.getTime()); 156 }; 157 158 /** 159 * Compares this instance to a Date object and returns an number indication of their relative values. 160 * @param {Date} Date object to compare [Required] 161 * @return {Number} -1 = this is lessthan date. 0 = values are equal. 1 = this is greaterthan date. 162 */ 163 $P.compareTo = function (date) { 164 return Date.compare(this, date); 165 }; 166 167 /** 168 * Compares this instance to another Date object and returns true if they are equal. 169 * @param {Date} Date object to compare. If no date to compare, new Date() [now] is used. 170 * @return {Boolean} true if dates are equal. false if they are not equal. 171 */ 172 $P.equals = function (date) { 173 return Date.equals(this, date || new Date()); 174 }; 175 176 /** 177 * Determines if this instance is between a range of two dates or equal to either the start or end dates. 178 * @param {Date} Start of range [Required] 179 * @param {Date} End of range [Required] 180 * @return {Boolean} true is this is between or equal to the start and end dates, else false 181 */ 182 $P.between = function (start, end) { 183 return this.getTime() >= start.getTime() && this.getTime() <= end.getTime(); 184 }; 185 186 /** 187 * Determines if this date occurs after the date to compare to. 188 * @param {Date} Date object to compare. If no date to compare, new Date() ("now") is used. 189 * @return {Boolean} true if this date instance is greater than the date to compare to (or "now"), otherwise false. 190 */ 191 $P.isAfter = function (date) { 192 return this.compareTo(date || new Date()) === 1; 193 }; 194 195 /** 196 * Determines if this date occurs before the date to compare to. 197 * @param {Date} Date object to compare. If no date to compare, new Date() ("now") is used. 198 * @return {Boolean} true if this date instance is less than the date to compare to (or "now"). 199 */ 200 $P.isBefore = function (date) { 201 return (this.compareTo(date || new Date()) === -1); 202 }; 203 204 /** 205 * Determines if the current Date instance occurs today. 206 * @return {Boolean} true if this date instance is 'today', otherwise false. 207 */ 208 209 /** 210 * Determines if the current Date instance occurs on the same Date as the supplied 'date'. 211 * If no 'date' to compare to is provided, the current Date instance is compared to 'today'. 212 * @param {date} Date object to compare. If no date to compare, the current Date ("now") is used. 213 * @return {Boolean} true if this Date instance occurs on the same Day as the supplied 'date'. 214 */ 215 $P.isToday = $P.isSameDay = function (date) { 216 return this.clone().clearTime().equals((date || new Date()).clone().clearTime()); 217 }; 218 219 /** 220 * Adds the specified number of milliseconds to this instance. 221 * @param {Number} The number of milliseconds to add. The number can be positive or negative [Required] 222 * @return {Date} this 223 */ 224 $P.addMilliseconds = function (value) { 225 this.setMilliseconds(this.getMilliseconds() + value * 1); 226 return this; 227 }; 228 229 /** 230 * Adds the specified number of seconds to this instance. 231 * @param {Number} The number of seconds to add. The number can be positive or negative [Required] 232 * @return {Date} this 233 */ 234 $P.addSeconds = function (value) { 235 return this.addMilliseconds(value * 1000); 236 }; 237 238 /** 239 * Adds the specified number of seconds to this instance. 240 * @param {Number} The number of seconds to add. The number can be positive or negative [Required] 241 * @return {Date} this 242 */ 243 $P.addMinutes = function (value) { 244 return this.addMilliseconds(value * 60000); /* 60*1000 */ 245 }; 246 247 /** 248 * Adds the specified number of hours to this instance. 249 * @param {Number} The number of hours to add. The number can be positive or negative [Required] 250 * @return {Date} this 251 */ 252 $P.addHours = function (value) { 253 return this.addMilliseconds(value * 3600000); /* 60*60*1000 */ 254 }; 255 256 /** 257 * Adds the specified number of days to this instance. 258 * @param {Number} The number of days to add. The number can be positive or negative [Required] 259 * @return {Date} this 260 */ 261 $P.addDays = function (value) { 262 this.setDate(this.getDate() + value * 1); 263 return this; 264 }; 265 266 /** 267 * Adds the specified number of weeks to this instance. 268 * @param {Number} The number of weeks to add. The number can be positive or negative [Required] 269 * @return {Date} this 270 */ 271 $P.addWeeks = function (value) { 272 return this.addDays(value * 7); 273 }; 274 275 /** 276 * Adds the specified number of months to this instance. 277 * @param {Number} The number of months to add. The number can be positive or negative [Required] 278 * @return {Date} this 279 */ 280 $P.addMonths = function (value) { 281 var n = this.getDate(); 282 this.setDate(1); 283 this.setMonth(this.getMonth() + value * 1); 284 this.setDate(Math.min(n, $D.getDaysInMonth(this.getFullYear(), this.getMonth()))); 285 return this; 286 }; 287 288 /** 289 * Adds the specified number of years to this instance. 290 * @param {Number} The number of years to add. The number can be positive or negative [Required] 291 * @return {Date} this 292 */ 293 $P.addYears = function (value) { 294 return this.addMonths(value * 12); 295 }; 296 297 /** 298 * Adds (or subtracts) to the value of the years, months, weeks, days, hours, minutes, seconds, milliseconds of the date instance using given configuration object. Positive and Negative values allowed. 299 * Example 300 <pre><code> 301 Date.today().add( { days: 1, months: 1 } ) 302 303 new Date().add( { years: -1 } ) 304 </code></pre> 305 * @param {Object} Configuration object containing attributes (months, days, etc.) 306 * @return {Date} this 307 */ 308 $P.add = function (config) { 309 if (typeof config == "number") { 310 this._orient = config; 311 return this; 312 } 313 314 var x = config; 315 316 if (x.milliseconds) { 317 this.addMilliseconds(x.milliseconds); 318 } 319 if (x.seconds) { 320 this.addSeconds(x.seconds); 321 } 322 if (x.minutes) { 323 this.addMinutes(x.minutes); 324 } 325 if (x.hours) { 326 this.addHours(x.hours); 327 } 328 if (x.weeks) { 329 this.addWeeks(x.weeks); 330 } 331 if (x.months) { 332 this.addMonths(x.months); 333 } 334 if (x.years) { 335 this.addYears(x.years); 336 } 337 if (x.days) { 338 this.addDays(x.days); 339 } 340 return this; 341 }; 342 343 var $y, $m, $d; 344 345 /** 346 * Get the week number. Week one (1) is the week which contains the first Thursday of the year. Monday is considered the first day of the week. 347 * This algorithm is a JavaScript port of the work presented by Claus Tøndering at http://www.tondering.dk/claus/cal/node8.html#SECTION00880000000000000000 348 * .getWeek() Algorithm Copyright (c) 2008 Claus Tondering. 349 * The .getWeek() function does NOT convert the date to UTC. The local datetime is used. Please use .getISOWeek() to get the week of the UTC converted date. 350 * @return {Number} 1 to 53 351 */ 352 $P.getWeek = function () { 353 var a, b, c, d, e, f, g, n, s, w; 354 355 $y = (!$y) ? this.getFullYear() : $y; 356 $m = (!$m) ? this.getMonth() + 1 : $m; 357 $d = (!$d) ? this.getDate() : $d; 358 359 if ($m <= 2) { 360 a = $y - 1; 361 b = (a / 4 | 0) - (a / 100 | 0) + (a / 400 | 0); 362 c = ((a - 1) / 4 | 0) - ((a - 1) / 100 | 0) + ((a - 1) / 400 | 0); 363 s = b - c; 364 e = 0; 365 f = $d - 1 + (31 * ($m - 1)); 366 } else { 367 a = $y; 368 b = (a / 4 | 0) - (a / 100 | 0) + (a / 400 | 0); 369 c = ((a - 1) / 4 | 0) - ((a - 1) / 100 | 0) + ((a - 1) / 400 | 0); 370 s = b - c; 371 e = s + 1; 372 f = $d + ((153 * ($m - 3) + 2) / 5) + 58 + s; 373 } 374 375 g = (a + b) % 7; 376 d = (f + g - e) % 7; 377 n = (f + 3 - d) | 0; 378 379 if (n < 0) { 380 w = 53 - ((g - s) / 5 | 0); 381 } else if (n > 364 + s) { 382 w = 1; 383 } else { 384 w = (n / 7 | 0) + 1; 385 } 386 387 $y = $m = $d = null; 388 389 return w; 390 }; 391 392 /** 393 * Get the ISO 8601 week number. Week one ("01") is the week which contains the first Thursday of the year. Monday is considered the first day of the week. 394 * The .getISOWeek() function does convert the date to it's UTC value. Please use .getWeek() to get the week of the local date. 395 * @return {String} "01" to "53" 396 */ 397 $P.getISOWeek = function () { 398 $y = this.getUTCFullYear(); 399 $m = this.getUTCMonth() + 1; 400 $d = this.getUTCDate(); 401 return p(this.getWeek()); 402 }; 403 404 /** 405 * Moves the date to Monday of the week set. Week one (1) is the week which contains the first Thursday of the year. 406 * @param {Number} A Number (1 to 53) that represents the week of the year. 407 * @return {Date} this 408 */ 409 $P.setWeek = function (n) { 410 return this.moveToDayOfWeek(1).addWeeks(n - this.getWeek()); 411 }; 412 413 // private 414 var validate = function (n, min, max, name) { 415 if (typeof n == "undefined") { 416 return false; 417 } else if (typeof n != "number") { 418 throw new TypeError(n + " is not a Number."); 419 } else if (n < min || n > max) { 420 throw new RangeError(n + " is not a valid value for " + name + "."); 421 } 422 return true; 423 }; 424 425 /** 426 * Validates the number is within an acceptable range for milliseconds [0-999]. 427 * @param {Number} The number to check if within range. 428 * @return {Boolean} true if within range, otherwise false. 429 */ 430 $D.validateMillisecond = function (value) { 431 return validate(value, 0, 999, "millisecond"); 432 }; 433 434 /** 435 * Validates the number is within an acceptable range for seconds [0-59]. 436 * @param {Number} The number to check if within range. 437 * @return {Boolean} true if within range, otherwise false. 438 */ 439 $D.validateSecond = function (value) { 440 return validate(value, 0, 59, "second"); 441 }; 442 443 /** 444 * Validates the number is within an acceptable range for minutes [0-59]. 445 * @param {Number} The number to check if within range. 446 * @return {Boolean} true if within range, otherwise false. 447 */ 448 $D.validateMinute = function (value) { 449 return validate(value, 0, 59, "minute"); 450 }; 451 452 /** 453 * Validates the number is within an acceptable range for hours [0-23]. 454 * @param {Number} The number to check if within range. 455 * @return {Boolean} true if within range, otherwise false. 456 */ 457 $D.validateHour = function (value) { 458 return validate(value, 0, 23, "hour"); 459 }; 460 461 /** 462 * Validates the number is within an acceptable range for the days in a month [0-MaxDaysInMonth]. 463 * @param {Number} The number to check if within range. 464 * @return {Boolean} true if within range, otherwise false. 465 */ 466 $D.validateDay = function (value, year, month) { 467 return validate(value, 1, $D.getDaysInMonth(year, month), "day"); 468 }; 469 470 /** 471 * Validates the number is within an acceptable range for months [0-11]. 472 * @param {Number} The number to check if within range. 473 * @return {Boolean} true if within range, otherwise false. 474 */ 475 $D.validateMonth = function (value) { 476 return validate(value, 0, 11, "month"); 477 }; 478 479 /** 480 * Validates the number is within an acceptable range for years. 481 * @param {Number} The number to check if within range. 482 * @return {Boolean} true if within range, otherwise false. 483 */ 484 $D.validateYear = function (value) { 485 return validate(value, 0, 9999, "year"); 486 }; 487 488 /** 489 * Set the value of year, month, day, hour, minute, second, millisecond of date instance using given configuration object. 490 * Example 491 <pre><code> 492 Date.today().set( { day: 20, month: 1 } ) 493 494 new Date().set( { millisecond: 0 } ) 495 </code></pre> 496 * 497 * @param {Object} Configuration object containing attributes (month, day, etc.) 498 * @return {Date} this 499 */ 500 $P.set = function (config) { 501 if ($D.validateMillisecond(config.millisecond)) { 502 this.addMilliseconds(config.millisecond - this.getMilliseconds()); 503 } 504 505 if ($D.validateSecond(config.second)) { 506 this.addSeconds(config.second - this.getSeconds()); 507 } 508 509 if ($D.validateMinute(config.minute)) { 510 this.addMinutes(config.minute - this.getMinutes()); 511 } 512 513 if ($D.validateHour(config.hour)) { 514 this.addHours(config.hour - this.getHours()); 515 } 516 517 if ($D.validateMonth(config.month)) { 518 this.addMonths(config.month - this.getMonth()); 519 } 520 521 if ($D.validateYear(config.year)) { 522 this.addYears(config.year - this.getFullYear()); 523 } 524 525 /* day has to go last because you can't validate the day without first knowing the month */ 526 if ($D.validateDay(config.day, this.getFullYear(), this.getMonth())) { 527 this.addDays(config.day - this.getDate()); 528 } 529 530 if (config.timezone) { 531 this.setTimezone(config.timezone); 532 } 533 534 if (config.timezoneOffset) { 535 this.setTimezoneOffset(config.timezoneOffset); 536 } 537 538 if (config.week && validate(config.week, 0, 53, "week")) { 539 this.setWeek(config.week); 540 } 541 542 return this; 543 }; 544 545 /** 546 * Moves the date to the first day of the month. 547 * @return {Date} this 548 */ 549 $P.moveToFirstDayOfMonth = function () { 550 return this.set({ day: 1 }); 551 }; 552 553 /** 554 * Moves the date to the last day of the month. 555 * @return {Date} this 556 */ 557 $P.moveToLastDayOfMonth = function () { 558 return this.set({ day: $D.getDaysInMonth(this.getFullYear(), this.getMonth())}); 559 }; 560 561 /** 562 * Moves the date to the next n'th occurrence of the dayOfWeek starting from the beginning of the month. The number (-1) is a magic number and will return the last occurrence of the dayOfWeek in the month. 563 * @param {Number} The dayOfWeek to move to 564 * @param {Number} The n'th occurrence to move to. Use (-1) to return the last occurrence in the month 565 * @return {Date} this 566 */ 567 $P.moveToNthOccurrence = function (dayOfWeek, occurrence) { 568 var shift = 0; 569 if (occurrence > 0) { 570 shift = occurrence - 1; 571 } 572 else if (occurrence === -1) { 573 this.moveToLastDayOfMonth(); 574 if (this.getDay() !== dayOfWeek) { 575 this.moveToDayOfWeek(dayOfWeek, -1); 576 } 577 return this; 578 } 579 return this.moveToFirstDayOfMonth().addDays(-1).moveToDayOfWeek(dayOfWeek, +1).addWeeks(shift); 580 }; 581 582 /** 583 * Move to the next or last dayOfWeek based on the orient value. 584 * @param {Number} The dayOfWeek to move to 585 * @param {Number} Forward (+1) or Back (-1). Defaults to +1. [Optional] 586 * @return {Date} this 587 */ 588 $P.moveToDayOfWeek = function (dayOfWeek, orient) { 589 var diff = (dayOfWeek - this.getDay() + 7 * (orient || +1)) % 7; 590 return this.addDays((diff === 0) ? diff += 7 * (orient || +1) : diff); 591 }; 592 593 /** 594 * Move to the next or last month based on the orient value. 595 * @param {Number} The month to move to. 0 = January, 11 = December 596 * @param {Number} Forward (+1) or Back (-1). Defaults to +1. [Optional] 597 * @return {Date} this 598 */ 599 $P.moveToMonth = function (month, orient) { 600 var diff = (month - this.getMonth() + 12 * (orient || +1)) % 12; 601 return this.addMonths((diff === 0) ? diff += 12 * (orient || +1) : diff); 602 }; 603 604 /** 605 * Get the Ordinal day (numeric day number) of the year, adjusted for leap year. 606 * @return {Number} 1 through 365 (366 in leap years) 607 */ 608 $P.getOrdinalNumber = function () { 609 return Math.ceil((this.clone().clearTime() - new Date(this.getFullYear(), 0, 1)) / 86400000) + 1; 610 }; 611 612 /** 613 * Get the time zone abbreviation of the current date. 614 * @return {String} The abbreviated time zone name (e.g. "EST") 615 */ 616 $P.getTimezone = function () { 617 return $D.getTimezoneAbbreviation(this.getUTCOffset()); 618 }; 619 620 $P.setTimezoneOffset = function (offset) { 621 var here = this.getTimezoneOffset(), there = Number(offset) * -6 / 10; 622 return this.addMinutes(there - here); 623 }; 624 625 $P.setTimezone = function (offset) { 626 return this.setTimezoneOffset($D.getTimezoneOffset(offset)); 627 }; 628 629 /** 630 * Indicates whether Daylight Saving Time is observed in the current time zone. 631 * @return {Boolean} true|false 632 */ 633 $P.hasDaylightSavingTime = function () { 634 return (Date.today().set({month: 0, day: 1}).getTimezoneOffset() !== Date.today().set({month: 6, day: 1}).getTimezoneOffset()); 635 }; 636 637 /** 638 * Indicates whether this Date instance is within the Daylight Saving Time range for the current time zone. 639 * @return {Boolean} true|false 640 */ 641 $P.isDaylightSavingTime = function () { 642 return Date.today().set({month: 0, day: 1}).getTimezoneOffset() != this.getTimezoneOffset(); 643 }; 644 645 /** 646 * Get the offset from UTC of the current date. 647 * @return {String} The 4-character offset string prefixed with + or - (e.g. "-0500") 648 */ 649 $P.getUTCOffset = function () { 650 var n = this.getTimezoneOffset() * -10 / 6, r; 651 if (n < 0) { 652 r = (n - 10000).toString(); 653 return r.charAt(0) + r.substr(2); 654 } else { 655 r = (n + 10000).toString(); 656 return "+" + r.substr(1); 657 } 658 }; 659 660 /** 661 * Returns the number of milliseconds between this date and date. 662 * @param {Date} Defaults to now 663 * @return {Number} The diff in milliseconds 664 */ 665 $P.getElapsed = function (date) { 666 return (date || new Date()) - this; 667 }; 668 669 if (!$P.toISOString) { 670 /** 671 * Converts the current date instance into a string with an ISO 8601 format. The date is converted to it's UTC value. 672 * @return {String} ISO 8601 string of date 673 */ 674 $P.toISOString = function () { 675 // From http://www.json.org/json.js. Public Domain. 676 function f(n) { 677 return n < 10 ? '0' + n : n; 678 } 679 680 return '"' + this.getUTCFullYear() + '-' + 681 f(this.getUTCMonth() + 1) + '-' + 682 f(this.getUTCDate()) + 'T' + 683 f(this.getUTCHours()) + ':' + 684 f(this.getUTCMinutes()) + ':' + 685 f(this.getUTCSeconds()) + 'Z"'; 686 }; 20 687 } 21 return -1; 22 }; 23 24 /** 25 * Gets the day number (0-6) if given a CultureInfo specific string which is a valid dayName, abbreviatedDayName or shortestDayName (two char). 26 * @param {String} The name of the day (eg. "Monday, "Mon", "tuesday", "tue", "We", "we"). 27 * @return {Number} The day number 28 */ 29 Date.getDayNumberFromName = function (name) { 30 var n = Date.CultureInfo.dayNames, m = Date.CultureInfo.abbreviatedDayNames, o = Date.CultureInfo.shortestDayNames, s = name.toLowerCase(); 31 for (var i = 0; i < n.length; i++) { 32 if (n[i].toLowerCase() == s || m[i].toLowerCase() == s) { 33 return i; 34 } 35 } 36 return -1; 37 }; 38 39 /** 40 * Determines if the current date instance is within a LeapYear. 41 * @param {Number} The year (0-9999). 42 * @return {Boolean} true if date is within a LeapYear, otherwise false. 43 */ 44 Date.isLeapYear = function (year) { 45 return (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0)); 46 }; 47 48 /** 49 * Gets the number of days in the month, given a year and month value. Automatically corrects for LeapYear. 50 * @param {Number} The year (0-9999). 51 * @param {Number} The month (0-11). 52 * @return {Number} The number of days in the month. 53 */ 54 Date.getDaysInMonth = function (year, month) { 55 return [31, (Date.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month]; 56 }; 57 58 Date.getTimezoneOffset = function (s, dst) { 59 return (dst || false) ? Date.CultureInfo.abbreviatedTimeZoneDST[s.toUpperCase()] : 60 Date.CultureInfo.abbreviatedTimeZoneStandard[s.toUpperCase()]; 61 }; 62 63 Date.getTimezoneAbbreviation = function (offset, dst) { 64 var n = (dst || false) ? Date.CultureInfo.abbreviatedTimeZoneDST : Date.CultureInfo.abbreviatedTimeZoneStandard, p; 65 for (p in n) { 66 if (n[p] === offset) { 67 return p; 68 } 69 } 70 return null; 71 }; 72 73 /** 74 * Returns a new Date object that is an exact date and time copy of the original instance. 75 * @return {Date} A new Date instance 76 */ 77 Date.prototype.clone = function () { 78 return new Date(this.getTime()); 79 }; 80 81 /** 82 * Compares this instance to a Date object and return an number indication of their relative values. 83 * @param {Date} Date object to compare [Required] 84 * @return {Number} 1 = this is greaterthan date. -1 = this is lessthan date. 0 = values are equal 85 */ 86 Date.prototype.compareTo = function (date) { 87 if (isNaN(this)) { 88 throw new Error(this); 89 } 90 if (date instanceof Date && !isNaN(date)) { 91 return (this > date) ? 1 : (this < date) ? -1 : 0; 92 } else { 93 throw new TypeError(date); 94 } 95 }; 96 97 /** 98 * Compares this instance to another Date object and returns true if they are equal. 99 * @param {Date} Date object to compare [Required] 100 * @return {Boolean} true if dates are equal. false if they are not equal. 101 */ 102 Date.prototype.equals = function (date) { 103 return (this.compareTo(date) === 0); 104 }; 105 106 /** 107 * Determines is this instance is between a range of two dates or equal to either the start or end dates. 108 * @param {Date} Start of range [Required] 109 * @param {Date} End of range [Required] 110 * @return {Boolean} true is this is between or equal to the start and end dates, else false 111 */ 112 Date.prototype.between = function (start, end) { 113 var t = this.getTime(); 114 return t >= start.getTime() && t <= end.getTime(); 115 }; 116 117 /** 118 * Adds the specified number of milliseconds to this instance. 119 * @param {Number} The number of milliseconds to add. The number can be positive or negative [Required] 120 * @return {Date} this 121 */ 122 Date.prototype.addMilliseconds = function (value) { 123 this.setMilliseconds(this.getMilliseconds() + value); 124 return this; 125 }; 126 127 /** 128 * Adds the specified number of seconds to this instance. 129 * @param {Number} The number of seconds to add. The number can be positive or negative [Required] 130 * @return {Date} this 131 */ 132 Date.prototype.addSeconds = function (value) { 133 return this.addMilliseconds(value * 1000); 134 }; 135 136 /** 137 * Adds the specified number of seconds to this instance. 138 * @param {Number} The number of seconds to add. The number can be positive or negative [Required] 139 * @return {Date} this 140 */ 141 Date.prototype.addMinutes = function (value) { 142 return this.addMilliseconds(value * 60000); /* 60*1000 */ 143 }; 144 145 /** 146 * Adds the specified number of hours to this instance. 147 * @param {Number} The number of hours to add. The number can be positive or negative [Required] 148 * @return {Date} this 149 */ 150 Date.prototype.addHours = function (value) { 151 return this.addMilliseconds(value * 3600000); /* 60*60*1000 */ 152 }; 153 154 /** 155 * Adds the specified number of days to this instance. 156 * @param {Number} The number of days to add. The number can be positive or negative [Required] 157 * @return {Date} this 158 */ 159 Date.prototype.addDays = function (value) { 160 return this.addMilliseconds(value * 86400000); /* 60*60*24*1000 */ 161 }; 162 163 /** 164 * Adds the specified number of weeks to this instance. 165 * @param {Number} The number of weeks to add. The number can be positive or negative [Required] 166 * @return {Date} this 167 */ 168 Date.prototype.addWeeks = function (value) { 169 return this.addMilliseconds(value * 604800000); /* 60*60*24*7*1000 */ 170 }; 171 172 /** 173 * Adds the specified number of months to this instance. 174 * @param {Number} The number of months to add. The number can be positive or negative [Required] 175 * @return {Date} this 176 */ 177 Date.prototype.addMonths = function (value) { 178 var n = this.getDate(); 179 this.setDate(1); 180 this.setMonth(this.getMonth() + value); 181 this.setDate(Math.min(n, this.getDaysInMonth())); 182 return this; 183 }; 184 185 /** 186 * Adds the specified number of years to this instance. 187 * @param {Number} The number of years to add. The number can be positive or negative [Required] 188 * @return {Date} this 189 */ 190 Date.prototype.addYears = function (value) { 191 return this.addMonths(value * 12); 192 }; 193 194 /** 195 * Adds (or subtracts) to the value of the year, month, day, hour, minute, second, millisecond of the date instance using given configuration object. Positive and Negative values allowed. 196 * Example 197 <pre><code> 198 Date.today().add( { day: 1, month: 1 } ) 199 200 new Date().add( { year: -1 } ) 201 </code></pre> 202 * @param {Object} Configuration object containing attributes (month, day, etc.) 203 * @return {Date} this 204 */ 205 Date.prototype.add = function (config) { 206 if (typeof config == "number") { 207 this._orient = config; 208 return this; 209 } 210 var x = config; 211 if (x.millisecond || x.milliseconds) { 212 this.addMilliseconds(x.millisecond || x.milliseconds); 213 } 214 if (x.second || x.seconds) { 215 this.addSeconds(x.second || x.seconds); 216 } 217 if (x.minute || x.minutes) { 218 this.addMinutes(x.minute || x.minutes); 219 } 220 if (x.hour || x.hours) { 221 this.addHours(x.hour || x.hours); 222 } 223 if (x.month || x.months) { 224 this.addMonths(x.month || x.months); 225 } 226 if (x.year || x.years) { 227 this.addYears(x.year || x.years); 228 } 229 if (x.day || x.days) { 230 this.addDays(x.day || x.days); 231 } 232 return this; 233 }; 234 235 // private 236 Date._validate = function (value, min, max, name) { 237 if (typeof value != "number") { 238 throw new TypeError(value + " is not a Number."); 239 } else if (value < min || value > max) { 240 throw new RangeError(value + " is not a valid value for " + name + "."); 241 } 242 return true; 243 }; 244 245 /** 246 * Validates the number is within an acceptable range for milliseconds [0-999]. 247 * @param {Number} The number to check if within range. 248 * @return {Boolean} true if within range, otherwise false. 249 */ 250 Date.validateMillisecond = function (n) { 251 return Date._validate(n, 0, 999, "milliseconds"); 252 }; 253 254 /** 255 * Validates the number is within an acceptable range for seconds [0-59]. 256 * @param {Number} The number to check if within range. 257 * @return {Boolean} true if within range, otherwise false. 258 */ 259 Date.validateSecond = function (n) { 260 return Date._validate(n, 0, 59, "seconds"); 261 }; 262 263 /** 264 * Validates the number is within an acceptable range for minutes [0-59]. 265 * @param {Number} The number to check if within range. 266 * @return {Boolean} true if within range, otherwise false. 267 */ 268 Date.validateMinute = function (n) { 269 return Date._validate(n, 0, 59, "minutes"); 270 }; 271 272 /** 273 * Validates the number is within an acceptable range for hours [0-23]. 274 * @param {Number} The number to check if within range. 275 * @return {Boolean} true if within range, otherwise false. 276 */ 277 Date.validateHour = function (n) { 278 return Date._validate(n, 0, 23, "hours"); 279 }; 280 281 /** 282 * Validates the number is within an acceptable range for the days in a month [0-MaxDaysInMonth]. 283 * @param {Number} The number to check if within range. 284 * @return {Boolean} true if within range, otherwise false. 285 */ 286 Date.validateDay = function (n, year, month) { 287 return Date._validate(n, 1, Date.getDaysInMonth(year, month), "days"); 288 }; 289 290 /** 291 * Validates the number is within an acceptable range for months [0-11]. 292 * @param {Number} The number to check if within range. 293 * @return {Boolean} true if within range, otherwise false. 294 */ 295 Date.validateMonth = function (n) { 296 return Date._validate(n, 0, 11, "months"); 297 }; 298 299 /** 300 * Validates the number is within an acceptable range for years [0-9999]. 301 * @param {Number} The number to check if within range. 302 * @return {Boolean} true if within range, otherwise false. 303 */ 304 Date.validateYear = function (n) { 305 return Date._validate(n, 1, 9999, "seconds"); 306 }; 307 308 /** 309 * Set the value of year, month, day, hour, minute, second, millisecond of date instance using given configuration object. 310 * Example 311 <pre><code> 312 Date.today().set( { day: 20, month: 1 } ) 313 314 new Date().set( { millisecond: 0 } ) 315 </code></pre> 316 * 317 * @param {Object} Configuration object containing attributes (month, day, etc.) 318 * @return {Date} this 319 */ 320 Date.prototype.set = function (config) { 321 var x = config; 322 323 if (!x.millisecond && x.millisecond !== 0) { 324 x.millisecond = -1; 325 } 326 if (!x.second && x.second !== 0) { 327 x.second = -1; 328 } 329 if (!x.minute && x.minute !== 0) { 330 x.minute = -1; 331 } 332 if (!x.hour && x.hour !== 0) { 333 x.hour = -1; 334 } 335 if (!x.day && x.day !== 0) { 336 x.day = -1; 337 } 338 if (!x.month && x.month !== 0) { 339 x.month = -1; 340 } 341 if (!x.year && x.year !== 0) { 342 x.year = -1; 343 } 344 345 if (x.millisecond != -1 && Date.validateMillisecond(x.millisecond)) { 346 this.addMilliseconds(x.millisecond - this.getMilliseconds()); 347 } 348 if (x.second != -1 && Date.validateSecond(x.second)) { 349 this.addSeconds(x.second - this.getSeconds()); 350 } 351 if (x.minute != -1 && Date.validateMinute(x.minute)) { 352 this.addMinutes(x.minute - this.getMinutes()); 353 } 354 if (x.hour != -1 && Date.validateHour(x.hour)) { 355 this.addHours(x.hour - this.getHours()); 356 } 357 if (x.month !== -1 && Date.validateMonth(x.month)) { 358 this.addMonths(x.month - this.getMonth()); 359 } 360 if (x.year != -1 && Date.validateYear(x.year)) { 361 this.addYears(x.year - this.getFullYear()); 362 } 363 364 /* day has to go last because you can't validate the day without first knowing the month */ 365 if (x.day != -1 && Date.validateDay(x.day, this.getFullYear(), this.getMonth())) { 366 this.addDays(x.day - this.getDate()); 367 } 368 if (x.timezone) { 369 this.setTimezone(x.timezone); 370 } 371 if (x.timezoneOffset) { 372 this.setTimezoneOffset(x.timezoneOffset); 373 } 374 375 return this; 376 }; 377 378 /** 379 * Resets the time of this Date object to 12:00 AM (00:00), which is the start of the day. 380 * @return {Date} this 381 */ 382 Date.prototype.clearTime = function () { 383 this.setHours(0); 384 this.setMinutes(0); 385 this.setSeconds(0); 386 this.setMilliseconds(0); 387 return this; 388 }; 389 390 /** 391 * Determines whether or not this instance is in a leap year. 392 * @return {Boolean} true if this instance is in a leap year, else false 393 */ 394 Date.prototype.isLeapYear = function () { 395 var y = this.getFullYear(); 396 return (((y % 4 === 0) && (y % 100 !== 0)) || (y % 400 === 0)); 397 }; 398 399 /** 400 * Determines whether or not this instance is a weekday. 401 * @return {Boolean} true if this instance is a weekday 402 */ 403 Date.prototype.isWeekday = function () { 404 return !(this.is().sat() || this.is().sun()); 405 }; 406 407 /** 408 * Get the number of days in the current month, adjusted for leap year. 409 * @return {Number} The number of days in the month 410 */ 411 Date.prototype.getDaysInMonth = function () { 412 return Date.getDaysInMonth(this.getFullYear(), this.getMonth()); 413 }; 414 415 /** 416 * Moves the date to the first day of the month. 417 * @return {Date} this 418 */ 419 Date.prototype.moveToFirstDayOfMonth = function () { 420 return this.set({ day: 1 }); 421 }; 422 423 /** 424 * Moves the date to the last day of the month. 425 * @return {Date} this 426 */ 427 Date.prototype.moveToLastDayOfMonth = function () { 428 return this.set({ day: this.getDaysInMonth()}); 429 }; 430 431 /** 432 * Move to the next or last dayOfWeek based on the orient value. 433 * @param {Number} The dayOfWeek to move to. 434 * @param {Number} Forward (+1) or Back (-1). Defaults to +1. [Optional] 435 * @return {Date} this 436 */ 437 Date.prototype.moveToDayOfWeek = function (day, orient) { 438 var diff = (day - this.getDay() + 7 * (orient || +1)) % 7; 439 return this.addDays((diff === 0) ? diff += 7 * (orient || +1) : diff); 440 }; 441 442 /** 443 * Move to the next or last month based on the orient value. 444 * @param {Number} The month to move to. 0 = January, 11 = December. 445 * @param {Number} Forward (+1) or Back (-1). Defaults to +1. [Optional] 446 * @return {Date} this 447 */ 448 Date.prototype.moveToMonth = function (month, orient) { 449 var diff = (month - this.getMonth() + 12 * (orient || +1)) % 12; 450 return this.addMonths((diff === 0) ? diff += 12 * (orient || +1) : diff); 451 }; 452 453 /** 454 * Get the numeric day number of the year, adjusted for leap year. 455 * @return {Number} 0 through 364 (365 in leap years) 456 */ 457 Date.prototype.getDayOfYear = function () { 458 return Math.floor((this - new Date(this.getFullYear(), 0, 1)) / 86400000); 459 }; 460 461 /** 462 * Get the week of the year for the current date instance. 463 * @param {Number} A Number that represents the first day of the week (0-6) [Optional] 464 * @return {Number} 0 through 53 465 */ 466 Date.prototype.getWeekOfYear = function (firstDayOfWeek) { 467 var y = this.getFullYear(), m = this.getMonth(), d = this.getDate(); 468 469 var dow = firstDayOfWeek || Date.CultureInfo.firstDayOfWeek; 470 471 var offset = 7 + 1 - new Date(y, 0, 1).getDay(); 472 if (offset == 8) { 473 offset = 1; 474 } 475 var daynum = ((Date.UTC(y, m, d, 0, 0, 0) - Date.UTC(y, 0, 1, 0, 0, 0)) / 86400000) + 1; 476 var w = Math.floor((daynum - offset + 7) / 7); 477 if (w === dow) { 478 y--; 479 var prevOffset = 7 + 1 - new Date(y, 0, 1).getDay(); 480 if (prevOffset == 2 || prevOffset == 8) { 481 w = 53; 482 } else { 483 w = 52; 484 } 485 } 486 return w; 487 }; 488 489 /** 490 * Determine whether Daylight Saving Time (DST) is in effect 491 * @return {Boolean} True if DST is in effect. 492 */ 493 Date.prototype.isDST = function () { 494 console.log('isDST'); 495 /* TODO: not sure if this is portable ... get from Date.CultureInfo? */ 496 return this.toString().match(/(E|C|M|P)(S|D)T/)[2] == "D"; 497 }; 498 499 /** 500 * Get the timezone abbreviation of the current date. 501 * @return {String} The abbreviated timezone name (e.g. "EST") 502 */ 503 Date.prototype.getTimezone = function () { 504 return Date.getTimezoneAbbreviation(this.getUTCOffset, this.isDST()); 505 }; 506 507 Date.prototype.setTimezoneOffset = function (s) { 508 var here = this.getTimezoneOffset(), there = Number(s) * -6 / 10; 509 this.addMinutes(there - here); 510 return this; 511 }; 512 513 Date.prototype.setTimezone = function (s) { 514 return this.setTimezoneOffset(Date.getTimezoneOffset(s)); 515 }; 516 517 /** 518 * Get the offset from UTC of the current date. 519 * @return {String} The 4-character offset string prefixed with + or - (e.g. "-0500") 520 */ 521 Date.prototype.getUTCOffset = function () { 522 var n = this.getTimezoneOffset() * -10 / 6, r; 523 if (n < 0) { 524 r = (n - 10000).toString(); 525 return r[0] + r.substr(2); 526 } else { 527 r = (n + 10000).toString(); 528 return "+" + r.substr(1); 529 } 530 }; 531 532 /** 533 * Gets the name of the day of the week. 534 * @param {Boolean} true to return the abbreviated name of the day of the week 535 * @return {String} The name of the day 536 */ 537 Date.prototype.getDayName = function (abbrev) { 538 return abbrev ? Date.CultureInfo.abbreviatedDayNames[this.getDay()] : 539 Date.CultureInfo.dayNames[this.getDay()]; 540 }; 541 542 /** 543 * Gets the month name. 544 * @param {Boolean} true to return the abbreviated name of the month 545 * @return {String} The name of the month 546 */ 547 Date.prototype.getMonthName = function (abbrev) { 548 return abbrev ? Date.CultureInfo.abbreviatedMonthNames[this.getMonth()] : 549 Date.CultureInfo.monthNames[this.getMonth()]; 550 }; 551 552 // private 553 Date.prototype._toString = Date.prototype.toString; 554 555 /** 556 * Converts the value of the current Date object to its equivalent string representation. 557 * Format Specifiers 558 <pre> 559 Format Description Example 560 ------ --------------------------------------------------------------------------- ----------------------- 561 s The seconds of the minute between 1-59. "1" to "59" 562 ss The seconds of the minute with leading zero if required. "01" to "59" 563 564 m The minute of the hour between 0-59. "1" or "59" 565 mm The minute of the hour with leading zero if required. "01" or "59" 566 567 h The hour of the day between 1-12. "1" to "12" 568 hh The hour of the day with leading zero if required. "01" to "12" 569 570 H The hour of the day between 1-23. "1" to "23" 571 HH The hour of the day with leading zero if required. "01" to "23" 572 573 d The day of the month between 1 and 31. "1" to "31" 574 dd The day of the month with leading zero if required. "01" to "31" 575 ddd Abbreviated day name. Date.CultureInfo.abbreviatedDayNames. "Mon" to "Sun" 576 dddd The full day name. Date.CultureInfo.dayNames. "Monday" to "Sunday" 577 578 M The month of the year between 1-12. "1" to "12" 579 MM The month of the year with leading zero if required. "01" to "12" 580 MMM Abbreviated month name. Date.CultureInfo.abbreviatedMonthNames. "Jan" to "Dec" 581 MMMM The full month name. Date.CultureInfo.monthNames. "January" to "December" 582 583 yy Displays the year as a maximum two-digit number. "99" or "07" 584 yyyy Displays the full four digit year. "1999" or "2007" 585 586 t Displays the first character of the A.M./P.M. designator. "A" or "P" 587 Date.CultureInfo.amDesignator or Date.CultureInfo.pmDesignator 588 tt Displays the A.M./P.M. designator. "AM" or "PM" 589 Date.CultureInfo.amDesignator or Date.CultureInfo.pmDesignator 590 </pre> 591 * @param {String} A format string consisting of one or more format spcifiers [Optional]. 592 * @return {String} A string representation of the current Date object. 593 */ 594 Date.prototype.toString = function (format) { 595 var self = this; 596 597 var p = function p(s) { 598 return (s.toString().length == 1) ? "0" + s : s; 599 }; 600 601 return format ? format.replace(/dd?d?d?|MM?M?M?|yy?y?y?|hh?|HH?|mm?|ss?|tt?|zz?z?/g, 602 function (format) { 603 switch (format) { 604 case "hh": 605 return p(self.getHours() < 13 ? self.getHours() : (self.getHours() - 12)); 606 case "h": 607 return self.getHours() < 13 ? self.getHours() : (self.getHours() - 12); 608 case "HH": 609 return p(self.getHours()); 610 case "H": 611 return self.getHours(); 612 case "mm": 613 return p(self.getMinutes()); 614 case "m": 615 return self.getMinutes(); 616 case "ss": 617 return p(self.getSeconds()); 618 case "s": 619 return self.getSeconds(); 620 case "yyyy": 621 return self.getFullYear(); 622 case "yy": 623 return self.getFullYear().toString().substring(2, 4); 624 case "dddd": 625 return self.getDayName(); 626 case "ddd": 627 return self.getDayName(true); 628 case "dd": 629 return p(self.getDate()); 630 case "d": 631 return self.getDate().toString(); 632 case "MMMM": 633 return self.getMonthName(); 634 case "MMM": 635 return self.getMonthName(true); 636 case "MM": 637 return p((self.getMonth() + 1)); 638 case "M": 639 return self.getMonth() + 1; 640 case "t": 641 return self.getHours() < 12 ? Date.CultureInfo.amDesignator.substring(0, 1) : Date.CultureInfo.pmDesignator.substring(0, 1); 642 case "tt": 643 return self.getHours() < 12 ? Date.CultureInfo.amDesignator : Date.CultureInfo.pmDesignator; 644 case "zzz": 645 case "zz": 646 case "z": 647 return ""; 648 } 649 } 650 ) : this._toString(); 651 }; 688 689 // private 690 $P._toString = $P.toString; 691 692 /** 693 * Converts the value of the current Date object to its equivalent string representation. 694 * Format Specifiers 695 <pre> 696 CUSTOM DATE AND TIME FORMAT STRINGS 697 Format Description Example 698 ------ --------------------------------------------------------------------------- ----------------------- 699 s The seconds of the minute between 0-59. "0" to "59" 700 ss The seconds of the minute with leading zero if required. "00" to "59" 701 702 m The minute of the hour between 0-59. "0" or "59" 703 mm The minute of the hour with leading zero if required. "00" or "59" 704 705 h The hour of the day between 1-12. "1" to "12" 706 hh The hour of the day with leading zero if required. "01" to "12" 707 708 H The hour of the day between 0-23. "0" to "23" 709 HH The hour of the day with leading zero if required. "00" to "23" 710 711 d The day of the month between 1 and 31. "1" to "31" 712 dd The day of the month with leading zero if required. "01" to "31" 713 ddd Abbreviated day name. $C.abbreviatedDayNames. "Mon" to "Sun" 714 dddd The full day name. $C.dayNames. "Monday" to "Sunday" 715 716 M The month of the year between 1-12. "1" to "12" 717 MM The month of the year with leading zero if required. "01" to "12" 718 MMM Abbreviated month name. $C.abbreviatedMonthNames. "Jan" to "Dec" 719 MMMM The full month name. $C.monthNames. "January" to "December" 720 721 yy The year as a two-digit number. "99" or "08" 722 yyyy The full four digit year. "1999" or "2008" 723 724 t Displays the first character of the A.M./P.M. designator. "A" or "P" 725 $C.amDesignator or $C.pmDesignator 726 tt Displays the A.M./P.M. designator. "AM" or "PM" 727 $C.amDesignator or $C.pmDesignator 728 729 S The ordinal suffix ("st, "nd", "rd" or "th") of the current day. "st, "nd", "rd" or "th" 730 731 || *Format* || *Description* || *Example* || 732 || d || The CultureInfo shortDate Format Pattern || "M/d/yyyy" || 733 || D || The CultureInfo longDate Format Pattern || "dddd, MMMM dd, yyyy" || 734 || F || The CultureInfo fullDateTime Format Pattern || "dddd, MMMM dd, yyyy h:mm:ss tt" || 735 || m || The CultureInfo monthDay Format Pattern || "MMMM dd" || 736 || r || The CultureInfo rfc1123 Format Pattern || "ddd, dd MMM yyyy HH:mm:ss GMT" || 737 || s || The CultureInfo sortableDateTime Format Pattern || "yyyy-MM-ddTHH:mm:ss" || 738 || t || The CultureInfo shortTime Format Pattern || "h:mm tt" || 739 || T || The CultureInfo longTime Format Pattern || "h:mm:ss tt" || 740 || u || The CultureInfo universalSortableDateTime Format Pattern || "yyyy-MM-dd HH:mm:ssZ" || 741 || y || The CultureInfo yearMonth Format Pattern || "MMMM, yyyy" || 742 743 744 STANDARD DATE AND TIME FORMAT STRINGS 745 Format Description Example ("en-US") 746 ------ --------------------------------------------------------------------------- ----------------------- 747 d The CultureInfo shortDate Format Pattern "M/d/yyyy" 748 D The CultureInfo longDate Format Pattern "dddd, MMMM dd, yyyy" 749 F The CultureInfo fullDateTime Format Pattern "dddd, MMMM dd, yyyy h:mm:ss tt" 750 m The CultureInfo monthDay Format Pattern "MMMM dd" 751 r The CultureInfo rfc1123 Format Pattern "ddd, dd MMM yyyy HH:mm:ss GMT" 752 s The CultureInfo sortableDateTime Format Pattern "yyyy-MM-ddTHH:mm:ss" 753 t The CultureInfo shortTime Format Pattern "h:mm tt" 754 T The CultureInfo longTime Format Pattern "h:mm:ss tt" 755 u The CultureInfo universalSortableDateTime Format Pattern "yyyy-MM-dd HH:mm:ssZ" 756 y The CultureInfo yearMonth Format Pattern "MMMM, yyyy" 757 </pre> 758 * @param {String} A format string consisting of one or more format spcifiers [Optional]. 759 * @return {String} A string representation of the current Date object. 760 */ 761 $P.toString = function (format) { 762 var x = this; 763 764 // Standard Date and Time Format Strings. Formats pulled from CultureInfo file and 765 // may vary by culture. 766 if (format && format.length == 1) { 767 var c = $C.formatPatterns; 768 x.t = x.toString; 769 switch (format) { 770 case "d": 771 return x.t(c.shortDate); 772 case "D": 773 return x.t(c.longDate); 774 case "F": 775 return x.t(c.fullDateTime); 776 case "m": 777 return x.t(c.monthDay); 778 case "r": 779 return x.t(c.rfc1123); 780 case "s": 781 return x.t(c.sortableDateTime); 782 case "t": 783 return x.t(c.shortTime); 784 case "T": 785 return x.t(c.longTime); 786 case "u": 787 return x.t(c.universalSortableDateTime); 788 case "y": 789 return x.t(c.yearMonth); 790 } 791 } 792 793 var ord = function (n) { 794 switch (n * 1) { 795 case 1: 796 case 21: 797 case 31: 798 return "st"; 799 case 2: 800 case 22: 801 return "nd"; 802 case 3: 803 case 23: 804 return "rd"; 805 default: 806 return "th"; 807 } 808 }; 809 810 return format ? format.replace(/(\\)?(dd?d?d?|MM?M?M?|yy?y?y?|hh?|HH?|mm?|ss?|tt?|S)/g, 811 function (m) { 812 if (m.charAt(0) === "\\") { 813 return m.replace("\\", ""); 814 } 815 x.h = x.getHours; 816 switch (m) { 817 case "hh": 818 return p(x.h() < 13 ? (x.h() === 0 ? 12 : x.h()) : (x.h() - 12)); 819 case "h": 820 return x.h() < 13 ? (x.h() === 0 ? 12 : x.h()) : (x.h() - 12); 821 case "HH": 822 return p(x.h()); 823 case "H": 824 return x.h(); 825 case "mm": 826 return p(x.getMinutes()); 827 case "m": 828 return x.getMinutes(); 829 case "ss": 830 return p(x.getSeconds()); 831 case "s": 832 return x.getSeconds(); 833 case "yyyy": 834 return p(x.getFullYear(), 4); 835 case "yy": 836 return p(x.getFullYear()); 837 case "dddd": 838 return $C.dayNames[x.getDay()]; 839 case "ddd": 840 return $C.abbreviatedDayNames[x.getDay()]; 841 case "dd": 842 return p(x.getDate()); 843 case "d": 844 return x.getDate(); 845 case "MMMM": 846 return $C.monthNames[x.getMonth()]; 847 case "MMM": 848 return $C.abbreviatedMonthNames[x.getMonth()]; 849 case "MM": 850 return p((x.getMonth() + 1)); 851 case "M": 852 return x.getMonth() + 1; 853 case "t": 854 return x.h() < 12 ? $C.amDesignator.substring(0, 1) : $C.pmDesignator.substring(0, 1); 855 case "tt": 856 return x.h() < 12 ? $C.amDesignator : $C.pmDesignator; 857 case "S": 858 return ord(x.getDate()); 859 default: 860 return m; 861 } 862 } 863 ) : this._toString(); 864 }; 865 }());
Note: See TracChangeset
for help on using the changeset viewer.