├── .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 | }();
--------------------------------------------------------------------------------