"use strict";
|
|
const YEAR_ONE = new Date(2000, 0, -730118);
|
const UTC_YEAR_ONE = Date.UTC(2000, 0, -730118);
|
module.exports = {
|
id: 0x2A,
|
type: 'DATETIME2N',
|
name: 'DateTime2',
|
hasScale: true,
|
dataLengthLength: 1,
|
dataLengthFromScale: function dataLengthFromScale(scale) {
|
switch (scale) {
|
case 0:
|
case 1:
|
case 2:
|
return 3;
|
|
case 3:
|
case 4:
|
return 4;
|
|
case 5:
|
case 6:
|
case 7:
|
return 5;
|
}
|
},
|
declaration: function declaration(parameter) {
|
return 'datetime2(' + this.resolveScale(parameter) + ')';
|
},
|
resolveScale: function resolveScale(parameter) {
|
if (parameter.scale != null) {
|
return parameter.scale;
|
} else if (parameter.value === null) {
|
return 0;
|
} else {
|
return 7;
|
}
|
},
|
writeTypeInfo: function writeTypeInfo(buffer, parameter) {
|
buffer.writeUInt8(this.id);
|
buffer.writeUInt8(parameter.scale);
|
},
|
writeParameterData: function writeParameterData(buffer, parameter, options) {
|
if (parameter.value != null) {
|
const time = new Date(+parameter.value);
|
let timestamp;
|
|
if (options.useUTC) {
|
timestamp = ((time.getUTCHours() * 60 + time.getUTCMinutes()) * 60 + time.getUTCSeconds()) * 1000 + time.getUTCMilliseconds();
|
} else {
|
timestamp = ((time.getHours() * 60 + time.getMinutes()) * 60 + time.getSeconds()) * 1000 + time.getMilliseconds();
|
}
|
|
timestamp = timestamp * Math.pow(10, parameter.scale - 3);
|
timestamp += (parameter.value.nanosecondDelta != null ? parameter.value.nanosecondDelta : 0) * Math.pow(10, parameter.scale);
|
timestamp = Math.round(timestamp);
|
|
switch (parameter.scale) {
|
case 0:
|
case 1:
|
case 2:
|
buffer.writeUInt8(6);
|
buffer.writeUInt24LE(timestamp);
|
break;
|
|
case 3:
|
case 4:
|
buffer.writeUInt8(7);
|
buffer.writeUInt32LE(timestamp);
|
break;
|
|
case 5:
|
case 6:
|
case 7:
|
buffer.writeUInt8(8);
|
buffer.writeUInt40LE(timestamp);
|
}
|
|
if (options.useUTC) {
|
buffer.writeUInt24LE(Math.floor((+parameter.value - UTC_YEAR_ONE) / 86400000));
|
} else {
|
const dstDiff = -(parameter.value.getTimezoneOffset() - YEAR_ONE.getTimezoneOffset()) * 60 * 1000;
|
buffer.writeUInt24LE(Math.floor((+parameter.value - YEAR_ONE + dstDiff) / 86400000));
|
}
|
} else {
|
buffer.writeUInt8(0);
|
}
|
},
|
validate: function validate(value) {
|
if (value == null) {
|
return null;
|
}
|
|
if (!(value instanceof Date)) {
|
value = Date.parse(value);
|
}
|
|
if (isNaN(value)) {
|
return new TypeError('Invalid date.');
|
}
|
|
return value;
|
}
|
};
|