-1

Linux で gcc と PostgreSQL 8.2.19 で C++ と libpq (PostgreSQL C ライブラリ) を使用しています。「タイムゾーン付きタイムスタンプ」タイプの列を使用しています。libpq はクエリ結果を C 文字列として返します。時々 (常にではありません)、返された文字列が 1 時間前にシフトされていることがわかりました (ただし、他のタイムゾーンと同じ: +02、つまり CEST)。問題がクエリによって返される文字列 (「タイム ゾーン付きタイムスタンプ」タイプを含む列の名前を持つ通常の SELECT) に直接あり、その後の変換ではなく、ほとんどの実行が正確に実行されることを確認しました。これは Linux や PostgreSQL の (既知の) バグのようなものですか?

編集:次の変換でエラーが発生したため、プラットフォームでこのコードを試しました(明らかにライブラリを含む) http://codepad.org/HiBbjX0V 実際、これでも一貫性はありませんが、エラーは逆です:ほとんどの時間は1 時間前にシフトし、2 番目の出力でのみ、コードのように時間は 11:33:52 のままです。手動の時間設定とインターネットからの時間でUbuntuを試しました。どちらの場合もエラーがあります。エラーはシステムレベルにあると思いますが、それが何であるかはわかりません。

編集: タイムスタンプのある行が立て続けに 2 回更新され、コードで示したように Linux 型に変換された最初の更新が原因である可能性があるため、エラーが PostgreSQL からのものであるかどうかはわかりません。

4

1 に答える 1

2

乏しい経験のせいで愚かな間違いを犯しました。codepad のコードでわかるように、私は struct tm* データを malloc で割り当て、localtime(&now) で初期化しました。今は time_t now = time(NULL) 時間は正しく処理されます。これを行わないと、 struct tm* 型の変数はタイムゾーンを「知らない」と思います。

于 2013-10-08T09:24:00.987 に答える