Use node-postgres to get Postgres “timestamp without timezone” in utc
我有一些时间戳记存储为Postgres类型
我将以时间戳记
在psql中,如果运行查询
但是,如果在Node应用程序中,我使用node-postgres库运行相同的查询,则会获得本地时区的时间戳:
我尝试将postgresql.conf文件中的时区参数设置为:
我究竟做错了什么?
编辑
问题似乎在此文件中:https://github.com/brianc/node-postgres/blob/master/lib/types/textParsers.js
如果从Postgres返回的日期字符串没有指定时区(即
不是要重提一个老问题,而是要看看我在这里到底有什么完全相同的问题,有一个替代解决方案,它可以通过覆盖用于
1 2 3 4 5 | var pg = require('pg'); var types = pg.types; types.setTypeParser(1114, FUNCTION(stringValue) { RETURN stringValue; }); |
这将使node-pg无法将值解析为
来源:从node-postgres问题获得
您可以按照@BadIdeaException的建议修改解析器。以下是有关为何无法按预期运行的更多详细信息,以及两种可能的解决方案。
对于类型为
任何时候在Javascript中创建Date对象时,如果未指定时区,则会假定该日期在当前时区中。对于UTC日期,根据定义,该日期位于GMT时区,除非您的Javascript恰好在GMT时区中运行,否则它将为您提供一个具有不正确的绝对值(date.value)的日期。
因此,该ISO 8601字符串不能通过Date构造函数直接转换为UTC日期。您的选择是:修改字符串,以便将其解释为UTC:
1 2 3 4 5 | var pg = require('pg'); var types = pg.types; types.setTypeParser(1114, FUNCTION(stringValue) { RETURN NEW DATE(stringValue +"+0000"); }); |
或使用"错误的"(当前)时区创建日期,然后为其提取值(仍在当前时区中),然后使用这些值在UTC时区中生成日期。请注意,Date.UTC()返回一个日期值而不是一个对象,然后可以将其传递给Date构造函数。
1 2 3 4 5 6 7 | types.setTypeParser(1114, FUNCTION(stringValue) { var temp = NEW DATE(stringValue); RETURN NEW DATE(DATE.UTC( temp.getFullYear(), temp.getMonth(), temp.getHours(), temp.getMinutes(), temp.getSeconds(), temp.getMilliseconds()) ); } |
这不是最好的解决方案,但我只是改用Postgres类型