bcd-date
Version:
Decodes a BCD datetime buffer into a normal javascript date object
69 lines (54 loc) • 1.65 kB
JavaScript
;
var bcd = require('bcd');
var moment = require('moment');
function _decodeMillisecond(bytes) {
var number = bcd.decode(bytes);
var numberString = number.toString();
var length = Math.max(1, numberString.length - 1);
var lastDigitRemoved = numberString.slice(0, length);
return parseInt(lastDigitRemoved);
}
function _encodeMilliseconds(date) {
var millisecond = date.format('SSS');
var msd = millisecond.slice(0, 2);
var lsd = millisecond.slice(2, 3) + date.weekday();
return Buffer.concat([bcd.encode(msd), bcd.encode(lsd)]);
}
function decode(bytes, useUtc) {
var date = [
2000 + bcd.decode(bytes.slice(0, 1)),
bcd.decode(bytes.slice(1, 2)) - 1,
bcd.decode(bytes.slice(2, 3)),
bcd.decode(bytes.slice(3, 4)),
bcd.decode(bytes.slice(4, 5)),
bcd.decode(bytes.slice(5, 6)),
_decodeMillisecond(bytes.slice(6, 8))
];
if (useUtc) {
return moment.utc(date).toDate();
} else {
return moment(date).toDate();
}
}
function encode(encodedDate, useUtc) {
var date = null;
if (useUtc) {
date = moment.utc(encodedDate);
} else {
date = moment(encodedDate);
}
var splitDate = [
bcd.encode(date.year() - 2000, 1),
bcd.encode(date.month() + 1 , 1),
bcd.encode(date.date() , 1),
bcd.encode(date.hour() , 1),
bcd.encode(date.minute() , 1),
bcd.encode(date.second() , 1),
_encodeMilliseconds(date)
];
return splitDate.reduce(function(buffer, bytes) {
return Buffer.concat([buffer, bytes]);
}, new Buffer(0));
}
module.exports.decode = decode;
module.exports.encode = encode;