├── .gitignore ├── test ├── tests.html └── tests.js ├── package.json ├── README.md └── time.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | nbproject/ 3 | *~ 4 | \#*# -------------------------------------------------------------------------------- /test/tests.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Time.js Tests 5 | 6 | 7 | 8 |
9 |
10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "time.js", 3 | "description": "Date-less time handling for JavaScript", 4 | "keywords": ["date", "time", "formatting", "parsing"], 5 | "version": "0.0.3", 6 | "author": "Chad Engler ", 7 | "repository": { 8 | "type": "git", 9 | "url": "git://github.com/englercj/time.js.git" 10 | }, 11 | "bugs": { 12 | "url": "http://github.com/englercj/time.js/issues" 13 | }, 14 | "dependencies": {}, 15 | "devDependencies": {}, 16 | "main": "./time", 17 | "engines": { 18 | "node": ">=0.4.0" 19 | } 20 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Time.js 2 | ======= 3 | Date-less Time handler for JavaScript 4 | 5 | Purpose 6 | ======= 7 | Handle formatting of time values into human readable strings. Can format time values as specific as milliseconds to values as larger as days (no Month support). 8 | 9 | Usage 10 | ======= 11 | The Time function takes in 1 argument the amount of time in ms to be formatted. It can be used in two different ways: 12 | 13 | var time = new Time(60000); //60000ms or 1 minutes 14 | time.toString('%m'); //returns a string of this 'time' as a minute 15 | 16 | //OR 17 | 18 | Time.format(60000, '%m'); //does the same thing as above -------------------------------------------------------------------------------- /test/tests.js: -------------------------------------------------------------------------------- 1 | module('Registration'); 2 | test('Registers itself for use', 2, function() { 3 | ok(Time, 'Time is in the global object'); 4 | ok(Time.format, 'Time.format is in the global object'); 5 | }); 6 | 7 | module('Formating'); 8 | test('Formats 0ms Correctly', 5, function() { 9 | equal(Time.format(0, '%d:%h:%m:%s.%M'), '0:0:0:0.0'); 10 | equal(Time.format(0, '%h:%m:%s.%M'), '0:0:0.0'); 11 | equal(Time.format(0, '%m:%s.%M'), '0:0.0'); 12 | equal(Time.format(0, '%s.%M'), '0.0'); 13 | equal(Time.format(0, '%M'), '0'); 14 | }); 15 | 16 | test('Formats 56ms Correctly', 5, function() { 17 | equal(Time.format(56, '%d:%h:%m:%s.%M'), '0:0:0:0.56'); 18 | equal(Time.format(56, '%h:%m:%s.%M'), '0:0:0.56'); 19 | equal(Time.format(56, '%m:%s.%M'), '0:0.56'); 20 | equal(Time.format(56, '%s.%M'), '0.56'); 21 | equal(Time.format(56, '%M'), '56'); 22 | }); 23 | 24 | test('Formats 10secs 12ms Correctly', 5, function() { 25 | var _10s12ms = (10 * 1E3) + (12); 26 | 27 | equal(Time.format(_10s12ms, '%d:%h:%m:%s.%M'), '0:0:0:10.12'); 28 | equal(Time.format(_10s12ms, '%h:%m:%s.%M'), '0:0:10.12'); 29 | equal(Time.format(_10s12ms, '%m:%s.%M'), '0:10.12'); 30 | equal(Time.format(_10s12ms, '%s.%M'), '10.12'); 31 | equal(Time.format(_10s12ms, '%M'), '10012'); 32 | }); 33 | 34 | test('Formats 25mins 42secs 612ms Correctly', 5, function() { 35 | var _25m42s612ms = (25 * 60 * 1E3) + (42 * 1E3) + (612); 36 | 37 | equal(Time.format(_25m42s612ms, '%d:%h:%m:%s.%M'), '0:0:25:42.612'); 38 | equal(Time.format(_25m42s612ms, '%h:%m:%s.%M'), '0:25:42.612'); 39 | equal(Time.format(_25m42s612ms, '%m:%s.%M'), '25:42.612'); 40 | equal(Time.format(_25m42s612ms, '%s.%M'), '1542.612'); 41 | equal(Time.format(_25m42s612ms, '%M'), '1542612'); 42 | }); 43 | 44 | test('Formats 23hrs 58mins 2secs 999ms Correctly', 5, function() { 45 | var _23h58m2s999ms = (23 * 60 * 60 * 1E3) + (58 * 60 * 1E3) + (2 * 1E3) + (999); 46 | 47 | equal(Time.format(_23h58m2s999ms, '%d:%h:%m:%s.%M'), '0:23:58:2.999'); 48 | equal(Time.format(_23h58m2s999ms, '%h:%m:%s.%M'), '23:58:2.999'); 49 | equal(Time.format(_23h58m2s999ms, '%m:%s.%M'), '1438:2.999'); 50 | equal(Time.format(_23h58m2s999ms, '%s.%M'), '86282.999'); 51 | equal(Time.format(_23h58m2s999ms, '%M'), '86282999'); 52 | }); 53 | 54 | test('Formats 1day 3hrs 20min 56sec 200ms Correctly', 5, function() { 55 | var _1d3h20m56s200ms = (1 * 24 * 60 * 60 * 1E3) + (3 * 60 * 60 * 1E3) + (20 * 60 * 1E3) + (56 * 1E3) + (200); 56 | 57 | equal(Time.format(_1d3h20m56s200ms, '%d:%h:%m:%s.%M'), '1:3:20:56.200'); 58 | equal(Time.format(_1d3h20m56s200ms, '%h:%m:%s.%M'), '27:20:56.200'); 59 | equal(Time.format(_1d3h20m56s200ms, '%m:%s.%M'), '1640:56.200'); 60 | equal(Time.format(_1d3h20m56s200ms, '%s.%M'), '98456.200'); 61 | equal(Time.format(_1d3h20m56s200ms, '%M'), '98456200'); 62 | }); 63 | 64 | test('Formats 999days 23hrs 59min 59sec 999ms Correctly', 5, function() { 65 | var _500d23h59m59s999ms = (999 * 24 * 60 * 60 * 1E3) + (23 * 60 * 60 * 1E3) + (59 * 60 * 1E3) + (59 * 1E3) + (999); 66 | 67 | equal(Time.format(_500d23h59m59s999ms, '%d:%h:%m:%s.%M'), '999:23:59:59.999'); 68 | equal(Time.format(_500d23h59m59s999ms, '%h:%m:%s.%M'), '23999:59:59.999'); 69 | equal(Time.format(_500d23h59m59s999ms, '%m:%s.%M'), '1439999:59.999'); 70 | equal(Time.format(_500d23h59m59s999ms, '%s.%M'), '86399999.999'); 71 | equal(Time.format(_500d23h59m59s999ms, '%M'), '86399999999'); 72 | }); -------------------------------------------------------------------------------- /time.js: -------------------------------------------------------------------------------- 1 | //Format Strings: 2 | //////////////////// 3 | //%M - miliseconds 4 | //%s - seconds 5 | //%m - minutes 6 | //%h - hours 7 | //%d - days 8 | //can have a modifier like: 9 | //%s{5, 0} 10 | //in the format of: 11 | //{ 12 | // length to zero pad to reach (if number is >= length no modification is made), 13 | // decimal precision (rounded) where 0 is whole number (rounded) 14 | //} 15 | //so if we have 4.356 seconds 16 | //%s = '4' 17 | //%s{0} = '4' 18 | //%s{0, 0} = '4' 19 | //%s{2} = '04' 20 | //%s{2, 2} = '04.36' 21 | //%s{3, 1} = '004.4' 22 | ///////////////////// 23 | 24 | !function(undefined) { 25 | //private vars 26 | var get_formatters = /%[smhdM](\{[\d]+(,[ ]*[\d]+)?\})?/g, 27 | formatters = { 28 | ms: '%M', 29 | secs: '%s', 30 | mins: '%m', 31 | hrs: '%h', 32 | days: '%d' 33 | } 34 | 35 | //ctor 36 | function Time(ms) { 37 | this._total_ms = 0; 38 | if(ms) this._total_ms = ms; 39 | 40 | //parseMs(this); 41 | } 42 | 43 | //public instance methods 44 | Time.prototype.toString = function(fmat) { 45 | var formats = fmat.match(get_formatters), 46 | largest = getLargestFormatter(fmat); 47 | 48 | parseMs(this, largest); 49 | 50 | for(var i = 0; i < formats.length; ++i) { 51 | var f = formats[i], 52 | type = f.substr(0, 2), 53 | nums = f.match(/[\d]+/g), 54 | padding = 0, precision = 0, value = 0; 55 | 56 | if(nums) { 57 | padding = nums[0]; 58 | if(nums[1]) precision = nums[1]; 59 | } 60 | 61 | switch(f.substr(0,2)) { 62 | case formatters.ms: 63 | value = this._ms; 64 | break; 65 | case formatters.secs: 66 | value = this._secs; 67 | break; 68 | case formatters.mins: 69 | value = this._mins; 70 | break; 71 | case formatters.hrs: 72 | value = this._hrs; 73 | break; 74 | case formatters.days: 75 | value = this._days; 76 | break; 77 | } 78 | 79 | fmat = fmat.replace(f, pad(value/*Math.round(value * Math.pow(10, precision)) / Math.pow(10, precision)*/, padding)); 80 | } 81 | 82 | return fmat; 83 | }; 84 | 85 | //public static methods 86 | Time.format = function(ms, fmat) { 87 | return (new Time(ms)).toString(fmat); 88 | }; 89 | 90 | //private methods 91 | function pad(num, len) { 92 | var str = '' + num; //convert to string 93 | while(str.length < len) { 94 | str = '0' + str; 95 | } 96 | 97 | return str; 98 | } 99 | 100 | function getLargestFormatter(fmat) { 101 | if(fmat.indexOf(formatters.days) > -1) 102 | return formatters.days; 103 | if(fmat.indexOf(formatters.hrs) > -1) 104 | return formatters.hrs; 105 | if(fmat.indexOf(formatters.mins) > -1) 106 | return formatters.mins; 107 | if(fmat.indexOf(formatters.secs) > -1) 108 | return formatters.secs; 109 | if(fmat.indexOf(formatters.ms) > -1) 110 | return formatters.ms; 111 | } 112 | 113 | function parseMs(t, upTo) { 114 | var ms = t._total_ms; 115 | 116 | t._ms = 0; 117 | t._secs = 0; 118 | t._mins = 0; 119 | t._hrs = 0; 120 | t._days = 0; 121 | 122 | if(ms) { 123 | //ms in ms, ms in sec, sec in min, min in hrs, hrs in days 124 | var woopDivisor = [1, 1000, 60, 60, 24], 125 | woopFormat = [formatters.ms, formatters.secs, formatters.mins, formatters.hrs, formatters.days], 126 | woopUnits = ['_ms', '_secs', '_mins', '_hrs', '_days'], 127 | i = 0, maxWoop = 5; 128 | 129 | do 130 | { 131 | ms /= woopDivisor[i]; 132 | 133 | if(woopDivisor[i + 1] && woopFormat[i] != upTo) 134 | t[woopUnits[i]] = Math.floor(ms % woopDivisor[i + 1]); 135 | else if (ms >= 1) 136 | t[woopUnits[i]] = Math.floor(ms); 137 | 138 | 139 | ++i; 140 | } while(i < maxWoop && woopFormat[i - 1] != upTo); 141 | } 142 | } 143 | 144 | //exports, for node 145 | if(typeof(exports) !== 'undefined') 146 | exports.Time = Time; 147 | else 148 | window.Time = Time; 149 | }(); --------------------------------------------------------------------------------