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 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);
|