| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226 | /* * 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 occurred 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);
 |