-1

我在 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,因为带有时间戳的行会快速连续更新两次,也许 errr 是由于第一次更新时将小时转换为 Linux 类型,如我在代码中所示。

4

1 回答 1

2

由于我的惨痛经历,我犯了一个愚蠢的错误。正如您在键盘上的代码中看到的那样,我使用 malloc 分配了 struct tm* 数据,使用 localtime(&now) 进行初始化,其中 now 是 time_t now = time(NULL) 时间被正确处理。我认为如果不这样做,struct tm* 类型的变量“不知道”时区。

于 2013-10-08T09:24:00.987 回答