| /* |
| * Date Format 1.2.3 |
| * (c) 2007-2009 Steven Levithan <stevenlevithan.com> |
| * MIT license |
| * |
| * Includes enhancements by Scott Trenda <scott.trenda.net> |
| * and Kris Kowal <cixar.com/~kris.kowal/> |
| * |
| * Accepts a date, a mask, or a date and a mask. |
| * Returns a formatted version of the given date. |
| * The date defaults to the current date/time. |
| * The mask defaults to dateFormat.masks.default. |
| */ |
| |
| (function(global) { |
| 'use strict'; |
| |
| var dateFormat = (function() { |
| var token = /d{1,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\1?|[LloSZWN]|'[^']*'|'[^']*'/g; |
| var timezone = /\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g; |
| var timezoneClip = /[^-+\dA-Z]/g; |
| |
| // Regexes and supporting functions are cached through closure |
| return function (date, mask, utc, gmt) { |
| |
| // You can't provide utc if you skip other args (use the 'UTC:' mask prefix) |
| if (arguments.length === 1 && kindOf(date) === 'string' && !/\d/.test(date)) { |
| mask = date; |
| date = undefined; |
| } |
| |
| date = date || new Date; |
| |
| if(!(date instanceof Date)) { |
| date = new Date(date); |
| } |
| |
| if (isNaN(date)) { |
| throw TypeError('Invalid date'); |
| } |
| |
| mask = String(dateFormat.masks[mask] || mask || dateFormat.masks['default']); |
| |
| // Allow setting the utc/gmt argument via the mask |
| var maskSlice = mask.slice(0, 4); |
| if (maskSlice === 'UTC:' || maskSlice === 'GMT:') { |
| mask = mask.slice(4); |
| utc = true; |
| if (maskSlice === 'GMT:') { |
| gmt = true; |
| } |
| } |
| |
| var _ = utc ? 'getUTC' : 'get'; |
| var d = date[_ + 'Date'](); |
| var D = date[_ + 'Day'](); |
| var m = date[_ + 'Month'](); |
| var y = date[_ + 'FullYear'](); |
| var H = date[_ + 'Hours'](); |
| var M = date[_ + 'Minutes'](); |
| var s = date[_ + 'Seconds'](); |
| var L = date[_ + 'Milliseconds'](); |
| var o = utc ? 0 : date.getTimezoneOffset(); |
| var W = getWeek(date); |
| var N = getDayOfWeek(date); |
| var flags = { |
| d: d, |
| dd: pad(d), |
| ddd: dateFormat.i18n.dayNames[D], |
| dddd: dateFormat.i18n.dayNames[D + 7], |
| m: m + 1, |
| mm: pad(m + 1), |
| mmm: dateFormat.i18n.monthNames[m], |
| mmmm: dateFormat.i18n.monthNames[m + 12], |
| yy: String(y).slice(2), |
| yyyy: y, |
| h: H % 12 || 12, |
| hh: pad(H % 12 || 12), |
| H: H, |
| HH: pad(H), |
| M: M, |
| MM: pad(M), |
| s: s, |
| ss: pad(s), |
| l: pad(L, 3), |
| L: pad(Math.round(L / 10)), |
| t: H < 12 ? 'a' : 'p', |
| tt: H < 12 ? 'am' : 'pm', |
| T: H < 12 ? 'A' : 'P', |
| TT: H < 12 ? 'AM' : 'PM', |
| Z: gmt ? 'GMT' : utc ? 'UTC' : (String(date).match(timezone) || ['']).pop().replace(timezoneClip, ''), |
| o: (o > 0 ? '-' : '+') + pad(Math.floor(Math.abs(o) / 60) * 100 + Math.abs(o) % 60, 4), |
| S: ['th', 'st', 'nd', 'rd'][d % 10 > 3 ? 0 : (d % 100 - d % 10 != 10) * d % 10], |
| W: W, |
| N: N |
| }; |
| |
| return mask.replace(token, function (match) { |
| if (match in flags) { |
| return flags[match]; |
| } |
| return match.slice(1, match.length - 1); |
| }); |
| }; |
| })(); |
| |
| dateFormat.masks = { |
| 'default': 'ddd mmm dd yyyy HH:MM:ss', |
| 'shortDate': 'm/d/yy', |
| 'mediumDate': 'mmm d, yyyy', |
| 'longDate': 'mmmm d, yyyy', |
| 'fullDate': 'dddd, mmmm d, yyyy', |
| 'shortTime': 'h:MM TT', |
| 'mediumTime': 'h:MM:ss TT', |
| 'longTime': 'h:MM:ss TT Z', |
| 'isoDate': 'yyyy-mm-dd', |
| 'isoTime': 'HH:MM:ss', |
| 'isoDateTime': 'yyyy-mm-dd\'T\'HH:MM:sso', |
| 'isoUtcDateTime': 'UTC:yyyy-mm-dd\'T\'HH:MM:ss\'Z\'', |
| 'expiresHeaderFormat': 'ddd, dd mmm yyyy HH:MM:ss Z' |
| }; |
| |
| // Internationalization strings |
| dateFormat.i18n = { |
| dayNames: [ |
| 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', |
| 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday' |
| ], |
| monthNames: [ |
| 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec', |
| 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' |
| ] |
| }; |
| |
| function pad(val, len) { |
| val = String(val); |
| len = len || 2; |
| while (val.length < len) { |
| val = '0' + val; |
| } |
| return val; |
| } |
| |
| /** |
| * Get the ISO 8601 week number |
| * Based on comments from |
| * http://techblog.procurios.nl/k/n618/news/view/33796/14863/Calculate-ISO-8601-week-and-year-in-javascript.html |
| * |
| * @param {Object} `date` |
| * @return {Number} |
| */ |
| function getWeek(date) { |
| // Remove time components of date |
| var targetThursday = new Date(date.getFullYear(), date.getMonth(), date.getDate()); |
| |
| // Change date to Thursday same week |
| targetThursday.setDate(targetThursday.getDate() - ((targetThursday.getDay() + 6) % 7) + 3); |
| |
| // Take January 4th as it is always in week 1 (see ISO 8601) |
| var firstThursday = new Date(targetThursday.getFullYear(), 0, 4); |
| |
| // Change date to Thursday same week |
| firstThursday.setDate(firstThursday.getDate() - ((firstThursday.getDay() + 6) % 7) + 3); |
| |
| // Check if daylight-saving-time-switch occured and correct for it |
| var ds = targetThursday.getTimezoneOffset() - firstThursday.getTimezoneOffset(); |
| targetThursday.setHours(targetThursday.getHours() - ds); |
| |
| // Number of weeks between target Thursday and first Thursday |
| var weekDiff = (targetThursday - firstThursday) / (86400000*7); |
| return 1 + Math.floor(weekDiff); |
| } |
| |
| /** |
| * Get ISO-8601 numeric representation of the day of the week |
| * 1 (for Monday) through 7 (for Sunday) |
| * |
| * @param {Object} `date` |
| * @return {Number} |
| */ |
| function getDayOfWeek(date) { |
| var dow = date.getDay(); |
| if(dow === 0) { |
| dow = 7; |
| } |
| return dow; |
| } |
| |
| /** |
| * kind-of shortcut |
| * @param {*} val |
| * @return {String} |
| */ |
| function kindOf(val) { |
| if (val === null) { |
| return 'null'; |
| } |
| |
| if (val === undefined) { |
| return 'undefined'; |
| } |
| |
| if (typeof val !== 'object') { |
| return typeof val; |
| } |
| |
| if (Array.isArray(val)) { |
| return 'array'; |
| } |
| |
| return {}.toString.call(val) |
| .slice(8, -1).toLowerCase(); |
| }; |
| |
| |
| |
| if (typeof define === 'function' && define.amd) { |
| define(function () { |
| return dateFormat; |
| }); |
| } else if (typeof exports === 'object') { |
| module.exports = dateFormat; |
| } else { |
| global.dateFormat = dateFormat; |
| } |
| })(this); |