Knex 以静默方式转换 Postgres 时间戳与时区并返回错误的时间

2024-02-12

我的 psql 数据库中有一个表,其中的“trigger_time”列的类型为“TIMESTAMP WITH TIME ZONE DEFAULT now()”

我行中的数据是这样的2018-06-27 15:45:00-03.

从 psql 控制台运行时

SELECT trigger_time AT TIME ZONE 'UTC' 
FROM tasks 
WHERE task_id = 1;

此查询返回“2018-06-27 18:45:00”。

同样,当我跑步时

SELECT trigger_time AT TIME ZONE 'America/Glace_Bay' 
FROM tasks 
WHERE task_id = 1;

I get 2018-06-27 15:45:00

Using knex.raw("SELECT trigger_time AT TIME ZONE 'America/Glace_Bay' FROM tasks WHERE task_id = 1") I get 2018-06-27T18:45:00.000Z以及跑步时knex.raw("SELECT trigger_time AT TIME ZONE 'UTC' FROM tasks WHERE task_id = 1") I get 2018-06-27T21:45:00.000Z

knex 的这两个结果都不正确,如何让 knex 停止默默地更改我的数据?


事情可能会失败,因为当您在特定时区的数据库中查询日期时间并有效地将时间戳类型转换为没有时区的时间戳时。在这种情况下,数据库不会向 knex 发送有关返回时间所在时区的信息。

因此 knex (或者更确切地说 knex 使用的 pg 驱动程序)将您的时间戳解释为本地时间,这取决于运行 knex 的应用程序服务器的时区设置。

您可以像 UTC 一样获取时间,并使用 moment 或 luxon 库在 JavaScript 端进行时区转换(IMO 后者更适合时区处理)。

其他解决方案是告诉 pg 驱动程序时间戳和带有时区类型的时间戳不应转换为JavaScript Date对象。

可以这样做(https://github.com/brianc/node-pg-types https://github.com/brianc/node-pg-types):

const types = require('pg').types;
const TIMESTAMPTZ_OID = 1184;
const TIMESTAMP_OID = 1114;
types.setTypeParser(TIMESTAMPTZ_OID, val => val);
types.setTypeParser(TIMESTAMP_OID, val => val);

此代码使所有时间戳作为字符串返回,可以添加到例如开始时knexfile.js。这些返回的字符串将与数据库服务器本身返回的格式完全相同。

EDIT:

在原始帖子的代码中,当时间戳转换为时区时UTC数据库服务器转换timestamp with time zone类型要正常timestamp without time zone所以返回的值没有时区信息。要添加时区信息,您可以将 +02 添加到返回时间戳的末尾,如下所示:

select ('2010-01-01T00:00:00.000Z'::timestamptz AT TIME ZONE 'UTC')::text || '+00';

哪个返回2010-01-01 00:00:00+00到驱动程序,pg 驱动程序也可以正确读取。

这将有效地完成与仅设置相同的事情SET TIME ZONE 'UTC';在数据库服务器中,当创建连接并直接返回 timestamptz 列时:

SET TIME ZONE 'UTC';
select '2010-01-01T00:00:00.000+02:00'::timestamptz;

哪个会返回2009-12-31 22:00:00+00.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Knex 以静默方式转换 Postgres 时间戳与时区并返回错误的时间 的相关文章

随机推荐

  • 一种用子类组织和加载文件的干净方法

    我有一个父类 它提供用于操作硬件的抽象函数 以及一个充满类的目录 该类是该父类的子类 并提供特定于硬件的实现 例如 x86 函数 ARM 函数 我正在寻找一种 Pythonic 方式来导入目录中的文件并实例化它们 目前 父类位于顶级目录中
  • TensorFlow RuntimeError:在 SavedModel 中找不到与标签服务关联的 MetaGraphDef

    当我使用 simple save 保存模型时 当我尝试加载模型时出现运行时错误 保存的代码是 session Session inputs tf placeholder dtype tf float32 shape None height
  • 使用树状数据进行 pytest 嵌套参数化

    使用 pytest 我尝试测试像树一样的分层场景 让我们以文档结构为例 Document Chapter Paragraph 1 n 1 n 当文档包含多个章节时 一章包含多个段落 当开始测试新文档时 需要运行一些设置代码 当新的章节开始时
  • 改变跨度的类别

    我有两个div 如下所示 我想从div top2更改span s1的类名 但下面的代码不起作用 我怎样才能做到这一点 top1 s1 span myclass old toggleClass myclass new div span cla
  • 将android资源位图批量转换为不同密度的工具[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我需要在 Android 上发布后支持不同的显示密度 开发期间可绘制的 hdpi已增长至 160 个
  • 为 geom_smooth 线创建动态标签

    我有一个不断变化的 df 并且我正在对不同的值进行分组c 使用 ggplot2 我使用以下代码绘制它们 以获得具有多个线性回归线 geom smooth 的散点图 ggplot aes x a y b group c geom point
  • gcc 金丝雀:对 __stack_chk_guard 的未定义引用

    我正在尝试启用 gcc 的金丝雀生成 但我得到了对 stack chk guard 的未定义引用 来自 gcc 的 man 关于金丝雀的信息 mstack protector guard guard Generate stack prote
  • 接口与具体类

    下面我有一个 Person 接口 一个实现类和一个驱动程序类 该类用名称初始化 Person 并再次输出它 使用有什么好处 Person person new PersonImpl 代替 PersonImpl person new Pers
  • 如何在线程的执行中使用字典/字符串列表 - delphi

    我有一个线程类 TValidateInvoiceThread type TValidateInvoiceThread class TThread private FData TValidationData FInvoice TInvoice
  • 使用 BeautifulSoup 将表抓取到数据框中

    我正在尝试从硬币目录中抓取数据 有其中一页 http www gcoins net en catalog view 45518 我需要刮这个数据 https i stack imgur com 1zqhW png进入数据框 到目前为止我有这
  • 上传图片 $_FILES 未设置

    我正在尝试将文件上传到我的服务器 但问题是 if isset FILES upl 总是返回 false my php if SERVER REQUEST METHOD POST allowed array png jpg gif jpeg
  • Xcode 整数++ 加 4

    我有一个 xcode 项目 其中包含以下代码 在 fflayer h 中 int 芬贾尔 在fflayer m中 void ccTouchMoved UITouch touch withEvent UIEvent event CGSize
  • 在 javascript 中创建一个看起来正态分布的模式?

    我想通过添加随机性来创建看起来更像手绘线条的线条 我目前使用这个公式来修改坐标 x 10 Math floor Math random 20 这种随机分布是线性的 我想使用一些使它更有可能击中目标的东西 X根据看起来像但不一定是钟形曲线的东
  • 如何在本地删除文件同时将其保留在远程?

    我想做与此相反的事情从 Git 存储库中删除文件 而不将其从本地文件系统中删除 https stackoverflow com questions 1143796 remove a file from a git repository wi
  • 矩阵类 (dgCMatrix) 的 rowsum 函数的等效项

    对于基本 R 矩阵类 我们有rowsum函数 该函数对于计算行组之间的列总和非常快 Matrix 包中是否实现了等效的功能或方法 我对快速替代方案特别感兴趣rowsum对于大型 dgCMatrix 对象 即数百万行 但大约 95 稀疏 我知
  • 禁用 的表单是否会被黑客入侵而提交?

    我只是好奇系统的安全性
  • 带有复选框的 ExtJs 4 组合框

    我正在寻找 EXTJS4 组合框控件 它允许通过内部的复选框选择多个项目 其实我需要这个控制http lovcombo extjs eu http lovcombo extjs eu 但它是为 ExtJs3 实现的 我尝试将其转换为 Ext
  • 使用oracle jdbc连接时如何获取数据库模式名称?

    我正在尝试使用 DatabaseMetaData getTables 方法获取所有数据库表 但此方法需要数据库模式名称模式 是否可以获取当前数据库连接的架构名称 当前连接的标准架构是您用于登录的用户的名称 因此 如果您的用户是SCOTT你必
  • WorkManager Data.Builder 不支持 Parcelable

    当您有一个包含大量变量 布尔值 整数 字符串 的大型 POJO 并且您想要使用新的工作管理器来启动作业时 然后 您创建一个数据文件 该文件将添加到一次性工作请求对象中 构建此数据文件的最佳实践是什么 编写 100 行代码只是在构建器上为每个
  • Knex 以静默方式转换 Postgres 时间戳与时区并返回错误的时间

    我的 psql 数据库中有一个表 其中的 trigger time 列的类型为 TIMESTAMP WITH TIME ZONE DEFAULT now 我行中的数据是这样的2018 06 27 15 45 00 03 从 psql 控制台