从PostgreSQL DB和Linux转移了C / C中的时间戳

Shifted timestamp in C/C from PostgreSQL DB and Linux?

本文关键字:时间戳 转移 PostgreSQL DB Linux      更新时间:2023-10-16

我在Linux上使用C++和libpq(PostgreSQL C库(和gcc和PostgreSQL 8.2.19。我使用的是"时区时间戳"类型的列。libpq 以 C 字符串的形式返回查询结果。有时(并非总是(我发现返回的字符串向前移动了一个小时(但与其他字符串具有相同的时区:+02,即 CEST(。我验证了问题直接出在查询返回的字符串中(一个普通的 SELECT,其列的名称包含"时区时间戳"类型(,而不是后续转换和大多数执行运行。这是Linux和/或PostgreSQL的一种(已知的(错误吗?

编辑:有一次在以下转换中发生了错误,所以我在我的平台上尝试了这段代码(显然包括库(http://codepad.org/HiBbjX0V实际上,即使这样也不连贯,但错误恰恰相反:大多数时间时间向前移动一小时,只有在第二个输出中,小时仍然是 11:33:52,就像在代码中一样。我尝试了使用手动小时设置和互联网小时来的 Ubuntu。这两种情况都有错误。我认为错误在系统级别,但我不知道是什么。

编辑:我不再确定错误也来自 PostgreSQL,因为带有时间戳的行会快速连续更新两次,也许 erorr 是由于第一次更新,小时转换为 Linux 类型,如我在代码中所示。

由于我的恐惧经历,我犯了一个愚蠢的错误。正如您在代码键盘上的代码中看到的那样,我使用 malloc 分配了结构 tm* 数据,使用 localtime(&now( 初始化,现在time_t now = time(NULL( 时间得到正确处理。我认为如果不这样做,结构 tm* 类型的变量"不知道"时区。