deepEqual(_.date(new Date(2010, 1, 14, 15, 25, 50, 125)), _.date([2010, 1, 14, 15, 25, 50, 125]), "constructing with array === constructing with new Date()");
});
+ var stringTests = [
+ ['MM-DD-YYYY', '12-02-1999'],
+ ['DD-MM-YYYY', '12-02-1999'],
+ ['DD/MM/YYYY', '12/02/1999'],
+ ['DD_MM_YYYY', '12_02_1999'],
+ ['DD:MM:YYYY', '12:02:1999'],
+ ['D-M-YY', '2-2-99'],
+ ['YY', '99'],
+ ['DDD-YYYY', '300-1999'],
+ ['DD-MM-YYYY h:m:s', '12-02-1999 2:45:10'],
+ ['DD-MM-YYYY h:m:s a', '12-02-1999 2:45:10 am'],
+ ['DD-MM-YYYY h:m:s a', '12-02-1999 2:45:10 pm']
+ ];
+
+ test("_.date() with string format", stringTests.length, function() {
+ for (var i = 0; i < stringTests.length; i++) {
+ equal(_.date(stringTests[i][1], stringTests[i][0]).format(stringTests[i][0]), stringTests[i][1]);
+ }
+ });
+
+ test("_.date() with string format", 2, function() {
+ equal(_.date('71', 'YY').format('YYYY'), '1971');
+ equal(_.date('69', 'YY').format('YYYY'), '2069');
+ });
+
test("_.now()", 1, function() {
deepEqual(_.date(), _.now(), "_.now returns wrapped date");
});
_ = _date;
var date1 = new Date(2010, 2, 6, 15, 25, 50, 125),
- date2 = new Date(1000),
- rt1 = 1000 * 60 * 60 * 24 * 365 * 5,
- rt2 = 1000 * 30;
-
- JSLitmus.test('_.date().relative(1000 * 30)', function() {
- return _.date().relative(rt2);
- });
-
- JSLitmus.test('_.date().relative(1000 * 60 * 60 * 24 * 365 * 5)', function() {
- return _.date().relative(rt1);
- });
+ date2 = new Date(1000);
JSLitmus.test('_.date(date1)', function() {
return _.date(date1);
});
+
JSLitmus.test('_.date([2010, 2, 6, 15, 25, 50, 125])', function() {
return _.date([2010, 2, 6, 15, 25, 50, 125]);
});
+
JSLitmus.test('_.date(100000)', function() {
return _.date(100000);
});
+
JSLitmus.test('_.date("Mon, 25 Dec 1995 13:30:00 GMT")', function() {
return _.date("Mon, 25 Dec 1995 13:30:00 GMT");
});
+
+ JSLitmus.test('_.date("12-02-1999 2:45:10", "DD-MM-YYYY h:m:s")', function() {
+ return _.date("12-02-1999 2:45:10", "DD-MM-YYYY h:m:s");
+ });
+
JSLitmus.test('_.date()', function() {
return _.date();
});
+
})();
\ No newline at end of file
return input === undefined ? new Date() :
input instanceof _Date ? input.date :
input instanceof Date ? input :
- isArray(input) && input.length > 2 ? dateFromArray(input) :
+ isArray(input) ? dateFromArray(input) :
new Date(input);
}
}
};
+ function makeDateFromStringAndFormat(string, format) {
+ var array = [0],
+ charactersToPutInArray = /[0-9a-zA-Z]+/g,
+ inputParts = [],
+ formatParts = [],
+ i,
+ isPm;
+
+ // function to convert string input to date
+ function addTime(format, input) {
+ switch (format) {
+ // MONTH
+ case 'M' :
+ // fall through to MM
+ case 'MM' :
+ array[1] = ~~input - 1;
+ break;
+ // DAY OF MONTH
+ case 'D' :
+ // fall through to DDDD
+ case 'DD' :
+ // fall through to DDDD
+ case 'DDD' :
+ // fall through to DDDD
+ case 'DDDD' :
+ array[2] = ~~input;
+ break;
+ // YEAR
+ case 'YY' :
+ input = ~~input;
+ array[0] = input + (input > 70 ? 1900 : 2000);
+ break;
+ case 'YYYY' :
+ array[0] = ~~input;
+ break;
+ // AM / PM
+ case 'a' :
+ // fall through to A
+ case 'A' :
+ isPm = (input.toLowerCase() === 'pm');
+ break;
+ // 24 HOUR
+ case 'H' :
+ // fall through to hh
+ case 'HH' :
+ // fall through to hh
+ case 'h' :
+ // fall through to hh
+ case 'hh' :
+ array[3] = ~~input;
+ break;
+ // MINUTE
+ case 'm' :
+ // fall through to mm
+ case 'mm' :
+ array[4] = ~~input;
+ break;
+ // SECOND
+ case 's' :
+ // fall through to ss
+ case 'ss' :
+ array[5] = ~~input;
+ break;
+ }
+ }
+
+ // add input parts to array
+ string.replace(charactersToPutInArray, function(input) {
+ inputParts.push(input);
+ });
+ // add format parts to array
+ format.replace(charactersToPutInArray, function(input) {
+ formatParts.push(input);
+ });
+
+ for (i = 0; i < formatParts.length; i++) {
+ addTime(formatParts[i], inputParts[i]);
+ }
+
+ // handle am pm
+ if (isPm && array[3] < 12) {
+ array[3] += 12;
+ }
+
+ return new _Date(array);
+ }
+
_date = {
- date : function(input) {
- return new _Date(input);
+ date : function(input, format) {
+ return format ? makeDateFromStringAndFormat(input, format) : new _Date(input);
},
now : function(asTimestamp) {
return asTimestamp ? new Date().getTime() : _date.date();
-(function(a){function t(a){this.date=o(a);return this}function s(a){var b=Math.abs(a)/1e3,c=b/60,d=c/60,e=d/24,f=e/365;return b<45&&q("s",~~b)||b<90&&q("m")||c<45&&q("mm",~~c)||c<90&&q("h")||d<24&&q("hh",~~d)||d<48&&q("d")||e<25&&q("dd",~~e)||e<45&&q("M")||e<350&&q("MM",~~((e+15)/30))||f<2&&q("y")||q("yy",~~f)}function r(a,b){return p(a)-p(b)}function q(a,b){return i[a].replace(/%d/i,b||1)}function p(a){return isNaN(a)?o(a).getTime():a}function o(b){return b===a?new Date:b instanceof t?b.date:b instanceof Date?b:n(b)&&b.length>2?m(b):new Date(b)}function n(a){return Object.prototype.toString.call(a)==="[object Array]"}function m(a){return new Date(a[0],a[1]||0,a[2]||1,a[3]||0,a[4]||0,a[5]||0,a[6]||0)}function l(a,b,c){var d=a.date,e=(b.ms||0)+(b.s||0)*1e3+(b.m||0)*6e4+(b.h||0)*36e5+(b.d||0)*864e5+(b.w||0)*6048e5,f=(b.M||0)+(b.y||0)*12,g;e&&d.setMilliseconds(d.getMilliseconds()+e*c),f&&(g=d.getDate(),d.setDate(1),d.setMonth(d.getMonth()+f*c),d.setDate(Math.min((new Date(d.getFullYear(),d.getMonth()+1,0)).getDate(),g)));return a}function k(a,b){var c=a+"";while(c.length<b)c="0"+c;return c}var b=this,c=this,d,e=["January","February","March","April","May","June","July","August","September","October","November","December"],f=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],g=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],h=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],i={future:"in %s",past:"%s ago",s:"seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},j=function(a){var b=a%10;return~~(a%100/10)===1?"th":b===1?"st":b===2?"nd":b===3?"rd":"th"},u=t.prototype={format:function(a){function s(a){var b,q;switch(a){case"M":return c+1;case"Mo":return c+1+j(c+1);case"MM":return k(c+1,2);case"MMM":return f[c];case"MMMM":return e[c];case"D":return d;case"Do":return d+j(d);case"DD":return k(d,2);case"DDD":b=new Date(i,c,d),q=new Date(i,0,1);return~~((b-q)/864e5+1.5);case"DDDo":b=s("DDD");return b+j(b);case"DDDD":return k(s("DDD"),3);case"d":return l;case"do":return l+j(l);case"ddd":return h[l];case"dddd":return g[l];case"w":b=new Date(i,c,d-l+5),q=new Date(b.getFullYear(),0,4);return~~((b-q)/864e5/7+1.5);case"wo":b=s("w");return b+j(b);case"ww":return k(s("w"),2);case"YY":return(i+"").slice(-2);case"YYYY":return i;case"a":return m>11?"pm":"am";case"A":return m>11?"PM":"AM";case"H":return m;case"HH":return k(m,2);case"h":return m%12||12;case"hh":return k(m%12||12,2);case"m":return n;case"mm":return k(n,2);case"s":return o;case"ss":return k(o,2);case"z":return s("zz").replace(r,"");case"zz":b=p.indexOf("(");if(b>-1)return p.slice(b+1,p.indexOf(")"));return p.slice(p.indexOf(":")).replace(r,"");default:return a.replace("\\","")}}var b=this.date,c=b.getMonth(),d=b.getDate(),i=b.getFullYear(),l=b.getDay(),m=b.getHours(),n=b.getMinutes(),o=b.getSeconds(),p=b.toString(),q=/(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|dddd?|do?|w[o|w]?|YYYY|YY|a|A|hh?|HH?|mm?|ss?|zz?)/g,r=/[^A-Z]/g;return a.replace(q,s)},add:function(a){return l(this,a,1)},subtract:function(a){return l(this,a,-1)},customize:function(a){var b=a.ordinal,c=a.relativeTime;a.weekdays&&(g=a.weekdays),a.weekdaysShort&&(h=a.weekdaysShort),a.months&&(e=a.months),a.monthsShort&&(f=a.monthsShort);if(c)for(var d in c)c.hasOwnProperty(d)&&(i[d]=c[d]);b&&b instanceof Function&&(j=b)},from:function(a,b,c){var d=r(this.date,a),e=d<0?i.past:i.future;return c?d:b?s(d):e.replace(/%s/i,s(d))},fromNow:function(a,b){return this.from(d.now(),a,b)},isLeapYear:function(){return d.isLeapYear(this.date.getFullYear())}};d={date:function(a){return new t(a)},now:function(a){return a?(new Date).getTime():d.date()},isLeapYear:function(a){return a%4===0&&a%100!==0||a%400===0}},typeof window=="undefined"&&typeof module!="undefined"?module.exports=d:b._!==a?b._.mixin(d):b._=d})()
\ No newline at end of file
+(function(a){function v(a,b){function i(a,b){switch(a){case"M":case"MM":c[1]=~~b-1;break;case"D":case"DD":case"DDD":case"DDDD":c[2]=~~b;break;case"YY":b=~~b,c[0]=b+(b>70?1900:2e3);break;case"YYYY":c[0]=~~b;break;case"a":case"A":h=b.toLowerCase()==="pm";break;case"H":case"HH":case"h":case"hh":c[3]=~~b;break;case"m":case"mm":c[4]=~~b;break;case"s":case"ss":c[5]=~~b}}var c=[0],d=/[0-9a-zA-Z]+/g,e=[],f=[],g,h;a.replace(d,function(a){e.push(a)}),b.replace(d,function(a){f.push(a)});for(g=0;g<f.length;g++)i(f[g],e[g]);h&&c[3]<12&&(c[3]+=12);return new t(c)}function t(a){this.date=o(a);return this}function s(a){var b=Math.abs(a)/1e3,c=b/60,d=c/60,e=d/24,f=e/365;return b<45&&q("s",~~b)||b<90&&q("m")||c<45&&q("mm",~~c)||c<90&&q("h")||d<24&&q("hh",~~d)||d<48&&q("d")||e<25&&q("dd",~~e)||e<45&&q("M")||e<350&&q("MM",~~((e+15)/30))||f<2&&q("y")||q("yy",~~f)}function r(a,b){return p(a)-p(b)}function q(a,b){return i[a].replace(/%d/i,b||1)}function p(a){return isNaN(a)?o(a).getTime():a}function o(b){return b===a?new Date:b instanceof t?b.date:b instanceof Date?b:n(b)?m(b):new Date(b)}function n(a){return Object.prototype.toString.call(a)==="[object Array]"}function m(a){return new Date(a[0],a[1]||0,a[2]||1,a[3]||0,a[4]||0,a[5]||0,a[6]||0)}function l(a,b,c){var d=a.date,e=(b.ms||0)+(b.s||0)*1e3+(b.m||0)*6e4+(b.h||0)*36e5+(b.d||0)*864e5+(b.w||0)*6048e5,f=(b.M||0)+(b.y||0)*12,g;e&&d.setMilliseconds(d.getMilliseconds()+e*c),f&&(g=d.getDate(),d.setDate(1),d.setMonth(d.getMonth()+f*c),d.setDate(Math.min((new Date(d.getFullYear(),d.getMonth()+1,0)).getDate(),g)));return a}function k(a,b){var c=a+"";while(c.length<b)c="0"+c;return c}var b=this,c=this,d,e=["January","February","March","April","May","June","July","August","September","October","November","December"],f=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],g=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],h=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],i={future:"in %s",past:"%s ago",s:"seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},j=function(a){var b=a%10;return~~(a%100/10)===1?"th":b===1?"st":b===2?"nd":b===3?"rd":"th"},u=t.prototype={format:function(a){function s(a){var b,q;switch(a){case"M":return c+1;case"Mo":return c+1+j(c+1);case"MM":return k(c+1,2);case"MMM":return f[c];case"MMMM":return e[c];case"D":return d;case"Do":return d+j(d);case"DD":return k(d,2);case"DDD":b=new Date(i,c,d),q=new Date(i,0,1);return~~((b-q)/864e5+1.5);case"DDDo":b=s("DDD");return b+j(b);case"DDDD":return k(s("DDD"),3);case"d":return l;case"do":return l+j(l);case"ddd":return h[l];case"dddd":return g[l];case"w":b=new Date(i,c,d-l+5),q=new Date(b.getFullYear(),0,4);return~~((b-q)/864e5/7+1.5);case"wo":b=s("w");return b+j(b);case"ww":return k(s("w"),2);case"YY":return(i+"").slice(-2);case"YYYY":return i;case"a":return m>11?"pm":"am";case"A":return m>11?"PM":"AM";case"H":return m;case"HH":return k(m,2);case"h":return m%12||12;case"hh":return k(m%12||12,2);case"m":return n;case"mm":return k(n,2);case"s":return o;case"ss":return k(o,2);case"z":return s("zz").replace(r,"");case"zz":b=p.indexOf("(");if(b>-1)return p.slice(b+1,p.indexOf(")"));return p.slice(p.indexOf(":")).replace(r,"");default:return a.replace("\\","")}}var b=this.date,c=b.getMonth(),d=b.getDate(),i=b.getFullYear(),l=b.getDay(),m=b.getHours(),n=b.getMinutes(),o=b.getSeconds(),p=b.toString(),q=/(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|dddd?|do?|w[o|w]?|YYYY|YY|a|A|hh?|HH?|mm?|ss?|zz?)/g,r=/[^A-Z]/g;return a.replace(q,s)},add:function(a){return l(this,a,1)},subtract:function(a){return l(this,a,-1)},customize:function(a){var b=a.ordinal,c=a.relativeTime;a.weekdays&&(g=a.weekdays),a.weekdaysShort&&(h=a.weekdaysShort),a.months&&(e=a.months),a.monthsShort&&(f=a.monthsShort);if(c)for(var d in c)c.hasOwnProperty(d)&&(i[d]=c[d]);b&&b instanceof Function&&(j=b)},from:function(a,b,c){var d=r(this.date,a),e=d<0?i.past:i.future;return c?d:b?s(d):e.replace(/%s/i,s(d))},fromNow:function(a,b){return this.from(d.now(),a,b)},isLeapYear:function(){return d.isLeapYear(this.date.getFullYear())}};d={date:function(a,b){return b?v(a,b):new t(a)},now:function(a){return a?(new Date).getTime():d.date()},isLeapYear:function(a){return a%4===0&&a%100!==0||a%400===0}},typeof window=="undefined"&&typeof module!="undefined"?module.exports=d:b._!==a?b._.mixin(d):b._date=d})()
\ No newline at end of file