indiaai-hackathon
/
datalab
/web
/node_modules
/bunyan-rotating-file-stream
/lib
/nextrotationtime.js
; | |
var _DEBUG = false; | |
var assert = require('assert'); | |
function nextRotTime(rotAt, periodScope, periodNum) { | |
if (_DEBUG) | |
console.log('-- _nextRotTime: %s%s', periodNum, periodScope); | |
var d = new Date(); | |
if (_DEBUG) console.log(' now local: %s', d); | |
if (_DEBUG) console.log(' now utc: %s', d.toISOString()); | |
var newRotAt; | |
switch (periodScope) { | |
case 'ms': | |
// Hidden millisecond period for debugging. | |
if (rotAt) { | |
newRotAt = rotAt + periodNum; | |
} else { | |
newRotAt = Date.now() + periodNum; | |
} | |
break; | |
case 'h': | |
if (rotAt) { | |
newRotAt = rotAt + periodNum * 60 * 60 * 1000; | |
} else { | |
// First time: top of the next hour. | |
newRotAt = Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), | |
d.getUTCDate(), d.getUTCHours() + 1); | |
} | |
break; | |
case 'd': | |
if (rotAt) { | |
newRotAt = rotAt + periodNum * 24 * 60 * 60 * 1000; | |
} else { | |
// First time: start of tomorrow (i.e. at the coming midnight) UTC. | |
newRotAt = Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), | |
d.getUTCDate() + 1); | |
} | |
break; | |
case 'w': | |
// Currently, always on Sunday morning at 00:00:00 (UTC). | |
if (rotAt) { | |
newRotAt = rotAt + periodNum * 7 * 24 * 60 * 60 * 1000; | |
} else { | |
// First time: this coming Sunday. | |
newRotAt = Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), | |
d.getUTCDate() + (7 - d.getUTCDay())); | |
} | |
break; | |
case 'm': | |
if (rotAt) { | |
newRotAt = Date.UTC(d.getUTCFullYear(), | |
d.getUTCMonth() + periodNum, 1); | |
} else { | |
// First time: the start of the next month. | |
newRotAt = Date.UTC(d.getUTCFullYear(), d.getUTCMonth() + 1, 1); | |
} | |
break; | |
case 'y': | |
if (rotAt) { | |
newRotAt = Date.UTC(d.getUTCFullYear() + periodNum, 0, 1); | |
} else { | |
// First time: the start of the next year. | |
newRotAt = Date.UTC(d.getUTCFullYear() + 1, 0, 1); | |
} | |
break; | |
default: | |
assert.fail('invalid period scope: "' + periodScope + '"'); | |
} | |
if (_DEBUG) { | |
console.log(' **rotAt**: %s (utc: %s)', newRotAt, | |
new Date(rotAt).toUTCString()); | |
var now = Date.now(); | |
console.log(' now: %s (%sms == %smin == %sh to go)', | |
now, | |
newRotAt - now, | |
(newRotAt-now)/1000/60, | |
(newRotAt-now)/1000/60/60); | |
} | |
return newRotAt; | |
}; | |
module.exports = nextRotTime; | |