mirror of
https://github.com/brianc/node-postgres.git
synced 2025-12-08 20:16:25 +00:00
Merge pull request #238 from cdauth/master
Store timezone-less dates in local time instead of UTC
This commit is contained in:
commit
8a2e864b30
@ -141,13 +141,17 @@ var parseNumeric = function(value) {
|
||||
return ((sign === 0) ? 1 : -1) * Math.round(result * scale) / scale;
|
||||
};
|
||||
|
||||
var parseDate = function(value) {
|
||||
var parseDate = function(isUTC, value) {
|
||||
var sign = parseBits(value, 1);
|
||||
var rawValue = parseBits(value, 63, 1);
|
||||
|
||||
// discard usecs and shift from 2000 to 1970
|
||||
var result = new Date((((sign === 0) ? 1 : -1) * rawValue / 1000) + 946684800000);
|
||||
|
||||
if (!isUTC) {
|
||||
result.setTime(result.getTime() + result.getTimezoneOffset() * 60000);
|
||||
}
|
||||
|
||||
// add microseconds to the date
|
||||
result.usec = rawValue % 1000;
|
||||
result.getMicroSeconds = function() {
|
||||
@ -247,8 +251,8 @@ var init = function(register) {
|
||||
register(700, parseFloat32);
|
||||
register(701, parseFloat64);
|
||||
register(16, parseBool);
|
||||
register(1114, parseDate);
|
||||
register(1184, parseDate);
|
||||
register(1114, parseDate.bind(null, false));
|
||||
register(1184, parseDate.bind(null, true));
|
||||
register(1007, parseArray);
|
||||
register(1016, parseArray);
|
||||
register(1008, parseArray);
|
||||
|
||||
29
lib/utils.js
29
lib/utils.js
@ -47,7 +47,7 @@ function arrayString(val) {
|
||||
//for complex types, etc...
|
||||
var prepareValue = function(val) {
|
||||
if(val instanceof Date) {
|
||||
return JSON.stringify(val);
|
||||
return dateToString(val);
|
||||
}
|
||||
if(typeof val === 'undefined') {
|
||||
return null;
|
||||
@ -58,6 +58,33 @@ var prepareValue = function(val) {
|
||||
return val === null ? null : val.toString();
|
||||
};
|
||||
|
||||
function dateToString(date) {
|
||||
function pad(number, digits) {
|
||||
number = ""+number;
|
||||
while(number.length < digits)
|
||||
number = "0"+number;
|
||||
return number;
|
||||
}
|
||||
|
||||
var offset = -date.getTimezoneOffset();
|
||||
var ret = pad(date.getFullYear(), 4) + '-' +
|
||||
pad(date.getMonth() + 1, 2) + '-' +
|
||||
pad(date.getDate(), 2) + 'T' +
|
||||
pad(date.getHours(), 2) + ':' +
|
||||
pad(date.getMinutes(), 2) + ':' +
|
||||
pad(date.getSeconds(), 2) + '.' +
|
||||
pad(date.getMilliseconds(), 3);
|
||||
|
||||
if(offset < 0) {
|
||||
ret += "-";
|
||||
offset *= -1;
|
||||
}
|
||||
else
|
||||
ret += "+";
|
||||
|
||||
return ret + pad(Math.floor(offset/60), 2) + ":" + pad(offset%60, 2);
|
||||
}
|
||||
|
||||
function normalizeQueryConfig (config, values, callback) {
|
||||
//can take in strings or config objects
|
||||
config = (typeof(config) == 'string') ? { text: config } : config;
|
||||
|
||||
29
test/integration/client/timezone-tests.js
Normal file
29
test/integration/client/timezone-tests.js
Normal file
@ -0,0 +1,29 @@
|
||||
var helper = require(__dirname + '/../test-helper');
|
||||
var exec = require('child_process').exec;
|
||||
|
||||
var oldTz = process.env.TZ;
|
||||
process.env.TZ = 'Europe/Berlin';
|
||||
|
||||
var date = new Date();
|
||||
|
||||
helper.pg.connect(helper.config, function(err, client, done) {
|
||||
assert.isNull(err);
|
||||
|
||||
test('timestamp without time zone', function() {
|
||||
client.query("SELECT CAST($1 AS TIMESTAMP WITHOUT TIME ZONE) AS \"val\"", [ date ], function(err, result) {
|
||||
assert.isNull(err);
|
||||
assert.equal(result.rows[0].val.getTime(), date.getTime());
|
||||
|
||||
test('timestamp with time zone', function() {
|
||||
client.query("SELECT CAST($1 AS TIMESTAMP WITH TIME ZONE) AS \"val\"", [ date ], function(err, result) {
|
||||
assert.isNull(err);
|
||||
assert.equal(result.rows[0].val.getTime(), date.getTime());
|
||||
|
||||
done();
|
||||
helper.pg.end();
|
||||
process.env.TZ = oldTz;
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
Loading…
x
Reference in New Issue
Block a user