Skip to content

Commit 574d3fb

Browse files
petrgazarovPetr Gazarov
authored and
Petr Gazarov
committed
Add getNextTransition() and getLastTransition() functions
1 parent 12bcf20 commit 574d3fb

File tree

3 files changed

+141
-1
lines changed

3 files changed

+141
-1
lines changed

moment-timezone.js

+34
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,10 @@
161161
}
162162
},
163163

164+
getNextTransition : getNextTransition,
165+
166+
getPreviousTransition : getPreviousTransition,
167+
164168
parse : function (timestamp) {
165169
var target = +timestamp,
166170
offsets = this.offsets,
@@ -362,6 +366,34 @@
362366
return cachedGuess;
363367
}
364368

369+
function getNextTransition (dateObject) {
370+
var currentTimezone = guess(),
371+
time = dateObject ? dateObject.valueOf() : Date.now(),
372+
untils = getZone(currentTimezone).untils;
373+
374+
for(var i = 0; i < untils.length; i++) {
375+
if (untils[i] > time) {
376+
return new moment(untils[i]);
377+
}
378+
}
379+
}
380+
381+
function getPreviousTransition (dateObject) {
382+
var currentTimezone = guess(),
383+
time = dateObject ? dateObject.valueOf() : Date.now(),
384+
untils = getZone(currentTimezone).untils,
385+
nextDSTIndex;
386+
387+
for(var i = 0; i < untils.length; i++) {
388+
if (untils[i] > time) {
389+
nextDSTIndex = i;
390+
break;
391+
}
392+
}
393+
394+
return new moment(untils[nextDSTIndex - 1]);
395+
}
396+
365397
/************************************
366398
Global Methods
367399
************************************/
@@ -510,6 +542,8 @@
510542
tz.needsOffset = needsOffset;
511543
tz.moveInvalidForward = true;
512544
tz.moveAmbiguousForward = false;
545+
tz.getNextTransition = getNextTransition;
546+
tz.getPreviousTransition = getPreviousTransition;
513547

514548
/************************************
515549
Interface with Moment.js
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
"use strict";
2+
3+
var tz = require("../../").tz;
4+
var moment = require('../../index');
5+
6+
var guess = tz.prototype.guess;
7+
var now = Date.prototype.now;
8+
9+
exports.getNextTransition = {
10+
setUp : function (done) {
11+
tz.prototype.guess = 'America/New_York';
12+
Date.now = function() { return 1361481581996 };
13+
done();
14+
},
15+
16+
tearDown : function (done) {
17+
tz.prototype.guess = guess;
18+
Date.now = now;
19+
done();
20+
},
21+
22+
"returns moment object with the date of next transition date relative to the moment or date object given as argument" : function (test) {
23+
var resultWithDate = tz.getNextTransition(new Date(1461481581996));
24+
test.equal(resultWithDate.valueOf(), 1478412000000);
25+
26+
var resultWithMoment = tz.getNextTransition(moment(1461481581996));
27+
test.equal(resultWithMoment.valueOf(), 1478412000000);
28+
29+
test.done();
30+
},
31+
32+
"when no argument is given, returns moment object with the date of next transition date relative to current time" : function (test) {
33+
var result = tz.getNextTransition();
34+
test.equal(result.valueOf(), 1362898800000);
35+
36+
test.done();
37+
}
38+
};
39+
40+
exports.getPreviousTransition = {
41+
setUp : function (done) {
42+
tz.prototype.guess = 'America/New_York';
43+
Date.now = function() { return 1361481581996 };
44+
done();
45+
},
46+
47+
tearDown : function (done) {
48+
tz.prototype.guess = guess;
49+
Date.now = now;
50+
done();
51+
},
52+
53+
"returns moment object with the date of previous transition date relative to the moment or date object given as argument" : function (test) {
54+
var resultWithDate = tz.getPreviousTransition(new Date(1461481581996));
55+
test.equal(resultWithDate.valueOf(), 1457852400000);
56+
57+
var resultWithMoment = tz.getPreviousTransition(moment(1461481581996));
58+
test.equal(resultWithMoment.valueOf(), 1457852400000);
59+
60+
test.done();
61+
},
62+
63+
"when no argument is given, returns moment object with the date of previous transition date relative to current time" : function (test) {
64+
var result = tz.getPreviousTransition();
65+
test.equal(result.valueOf(), 1352008800000);
66+
67+
test.done();
68+
}
69+
};

tests/moment-timezone/zone.js

+38-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
"use strict";
22

33
var tz = require("../../").tz;
4+
var guess = tz.prototype.guess;
5+
var now = Date.prototype.now;
6+
var moment = require('../../index');
47

58
// gE = 1000; 1E = 100; 2k = 140
69
var PACKED = "SomeZone|TIM TAM IAM|60.u 50 60|012101|gE 1E 2k 1E 2k";
@@ -11,12 +14,16 @@ exports.zone = {
1114
setUp : function (done) {
1215
moveAmbiguousForward = tz.moveAmbiguousForward;
1316
moveInvalidForward = tz.moveInvalidForward;
17+
tz.prototype.guess = 'America/New_York';
18+
Date.now = function() { return 82400000 };
1419
done();
1520
},
1621

1722
tearDown : function (done) {
1823
tz.moveAmbiguousForward = moveAmbiguousForward;
1924
tz.moveInvalidForward = moveInvalidForward;
25+
tz.prototype.guess = guess;
26+
Date.now = now;
2027
done();
2128
},
2229

@@ -144,5 +151,35 @@ exports.zone = {
144151
}
145152

146153
test.done();
147-
}
154+
},
155+
156+
getNextTransition : function (test) {
157+
var zone = new tz.Zone(PACKED);
158+
159+
var resultWithDate = zone.getNextTransition(new Date(65000000));
160+
test.equal(resultWithDate.valueOf(), 66000000);
161+
162+
var resultWithMoment = zone.getNextTransition(moment(65000000));
163+
test.equal(resultWithMoment.valueOf(), 66000000);
164+
165+
var result = zone.getNextTransition();
166+
test.equal(result.valueOf(), 88800000);
167+
168+
test.done();
169+
},
170+
171+
getPreviousTransition : function (test) {
172+
var zone = new tz.Zone(PACKED);
173+
174+
var resultWithDate = zone.getPreviousTransition(new Date(65000000));
175+
test.equal(resultWithDate.valueOf(), 60000000);
176+
177+
var resultWithMoment = zone.getPreviousTransition(moment(65000000));
178+
test.equal(resultWithMoment.valueOf(), 60000000);
179+
180+
var result = zone.getPreviousTransition();
181+
test.equal(result.valueOf(), 80400000);
182+
183+
test.done();
184+
}
148185
};

0 commit comments

Comments
 (0)