Skip to content

Commit

Permalink
Add getNextTransition() and getLastTransition() functions
Browse files Browse the repository at this point in the history
  • Loading branch information
petrgazarov authored and Petr Gazarov committed Feb 4, 2017
1 parent 12bcf20 commit 65d3629
Show file tree
Hide file tree
Showing 3 changed files with 141 additions and 1 deletion.
34 changes: 34 additions & 0 deletions moment-timezone.js
Expand Up @@ -161,6 +161,10 @@
}
},

getNextTransition : getNextTransition,

getPreviousTransition : getPreviousTransition,

parse : function (timestamp) {
var target = +timestamp,
offsets = this.offsets,
Expand Down Expand Up @@ -362,6 +366,34 @@
return cachedGuess;
}

function getNextTransition (dateObject) {
var currentTimezone = guess(),
time = dateObject ? dateObject.valueOf() : Date.now(),
untils = getZone(currentTimezone).untils;

for(var i = 0; i < untils.length; i++) {
if (untils[i] > time) {
return new moment(untils[i]);
}
}
}

function getPreviousTransition (dateObject) {
var currentTimezone = guess(),
time = dateObject ? dateObject.valueOf() : Date.now(),
untils = getZone(currentTimezone).untils,
nextDSTIndex;

for(var i = 0; i < untils.length; i++) {
if (untils[i] > time) {
nextDSTIndex = i;
break;
}
}

return new moment(untils[nextDSTIndex - 1]);
}

/************************************
Global Methods
************************************/
Expand Down Expand Up @@ -510,6 +542,8 @@
tz.needsOffset = needsOffset;
tz.moveInvalidForward = true;
tz.moveAmbiguousForward = false;
tz.getNextTransition = getNextTransition;
tz.getPreviousTransition = getPreviousTransition;

/************************************
Interface with Moment.js
Expand Down
69 changes: 69 additions & 0 deletions tests/moment-timezone/get-nearest-transition.js
@@ -0,0 +1,69 @@
"use strict";

var tz = require("../../").tz;
var moment = require('../../index');

var guess = tz.prototype.guess;
var now = Date.prototype.now;

exports.getNextTransition = {
setUp : function (done) {
tz.prototype.guess = 'America/New_York';
Date.now = function() { return 1361481581996 };
done();
},

tearDown : function (done) {
tz.prototype.guess = guess;
Date.now = now;
done();
},

"returns moment object with the date of next transition date relative to the moment or date object given as argument" : function (test) {
var resultWithDate = tz.getNextTransition(new Date(1461481581996));
test.equal(resultWithDate.valueOf(), 1478412000000);

var resultWithMoment = tz.getNextTransition(moment(1461481581996));
test.equal(resultWithMoment.valueOf(), 1478412000000);

test.done();
},

"when no argument is given, returns moment object with the date of next transition date relative to current time" : function (test) {
var result = tz.getNextTransition();
test.equal(result.valueOf(), 1362898800000);

test.done();
}
};

exports.getPreviousTransition = {
setUp : function (done) {
tz.prototype.guess = 'America/New_York';
Date.now = function() { return 1361481581996 };
done();
},

tearDown : function (done) {
tz.prototype.guess = guess;
Date.now = now;
done();
},

"returns moment object with the date of previous transition date relative to the moment or date object given as argument" : function (test) {
var resultWithDate = tz.getPreviousTransition(new Date(1461481581996));
test.equal(resultWithDate.valueOf(), 1457852400000);

var resultWithMoment = tz.getPreviousTransition(moment(1461481581996));
test.equal(resultWithMoment.valueOf(), 1457852400000);

test.done();
},

"when no argument is given, returns moment object with the date of previous transition date relative to current time" : function (test) {
var result = tz.getPreviousTransition();
test.equal(result.valueOf(), 1352008800000);

test.done();
}
};
39 changes: 38 additions & 1 deletion tests/moment-timezone/zone.js
@@ -1,6 +1,9 @@
"use strict";

var tz = require("../../").tz;
var guess = tz.prototype.guess;
var now = Date.prototype.now;
var moment = require('../../index');

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

tearDown : function (done) {
tz.moveAmbiguousForward = moveAmbiguousForward;
tz.moveInvalidForward = moveInvalidForward;
tz.prototype.guess = guess;
Date.now = now;
done();
},

Expand Down Expand Up @@ -144,5 +151,35 @@ exports.zone = {
}

test.done();
}
},

getNextTransition : function (test) {
var zone = new tz.Zone(PACKED);

var resultWithDate = zone.getNextTransition(new Date(65000000));
test.equal(resultWithDate.valueOf(), 66000000);

var resultWithMoment = zone.getNextTransition(moment(65000000));
test.equal(resultWithMoment.valueOf(), 66000000);

var result = zone.getNextTransition();
test.equal(result.valueOf(), 88800000);

test.done();
},

getPreviousTransition : function (test) {
var zone = new tz.Zone(PACKED);

var resultWithDate = zone.getPreviousTransition(new Date(65000000));
test.equal(resultWithDate.valueOf(), 60000000);

var resultWithMoment = zone.getPreviousTransition(moment(65000000));
test.equal(resultWithMoment.valueOf(), 60000000);

var result = zone.getPreviousTransition();
test.equal(result.valueOf(), 80400000);

test.done();
}
};

0 comments on commit 65d3629

Please sign in to comment.