From: Tim Wood Date: Thu, 5 May 2011 17:19:17 +0000 (-0700) Subject: Adding input format for inputting date as string X-Git-Tag: 0.4.1~2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=1611a049c9a56df1a28c6d2ba958a7fc63e847ff;p=thirdparty%2Fmoment.git Adding input format for inputting date as string --- diff --git a/test/date.js b/test/date.js index 479a0a30f..86993028d 100644 --- a/test/date.js +++ b/test/date.js @@ -13,6 +13,31 @@ $(function() { 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"); }); diff --git a/test/speed.js b/test/speed.js index c8cb5604e..28adb3c51 100644 --- a/test/speed.js +++ b/test/speed.js @@ -3,31 +3,30 @@ _ = _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 diff --git a/underscore.date.js b/underscore.date.js index 3e10e26ca..672a0e929 100644 --- a/underscore.date.js +++ b/underscore.date.js @@ -96,7 +96,7 @@ 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); } @@ -311,9 +311,96 @@ } }; + 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(); diff --git a/underscore.date.min.js b/underscore.date.min.js index 4be77a9c8..bc79668b6 100644 --- a/underscore.date.min.js +++ b/underscore.date.min.js @@ -1 +1 @@ -(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.length11?"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;g11?"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