0

データベーステーブルをレールから移行するという問題があります。表の列には、タイムゾーン付きのタイムスタンプも含まれています。

データベースにデータを挿入すると、タイムスタンプ列に現在の時刻が保存されます (例: 2012-08-09 12:00:00 UTC+6:30)

2012-08-09 18:30 という意味だと思います。しかし、レール3.2.6からこのデータを取得すると、2012-08-09 5:30と表示されます

実際の時間と 1 時間ずれて表示される理由。アイデアはありますか?お願いします

4

2 に答える 2

1

時間

2012-08-09 12:00:00 UTC+6:30

UTC+6:30(GMT+6:30)保存時のタイムゾーンです。

それを取得すると、GMTタイムゾーンで時間が取得されます。

どちらも と同じタイミング2012-08-09 5:30 GMT = 12:00:00 GMT+6:30です。

編集:

これは@CraigRinger...

まあ言ってみれば...

UTC is London and UTC + 6:30 is Rangoon so... 

6:30 at Rangoon = 12:00 at London
                         Subtracting 6:30 from both    
12:00 at Rangoon = 5:30 at London
12:00 UTC+6:30 = 5:30 UTC
Data stored in UTC+6:30 = Data retrieved in UTC 
于 2012-08-11T11:24:44.060 に答える
1

推測では、ある設定で保存timezoneし、別の設定で取得しています。

たとえば、Rails では UTC+6:30 であると認識されているが、PostgreSQL では UTC+5:30 であると認識されている場合、および Rails が Pg タイムゾーンに限定された日付を送信しているが、Pg からはそれらが UTC+6:30 であると想定してそれらを読み取る場合現地時間で、これは起こります。データベース ドライバーが常にタイムゾーン修飾された日付を読み書きするようにするのが最も安全です。

1 時間のずれがあるので、夏時間が関係しているのではないかと思いますが、タイムゾーンが 1 時間ずれている可能性もあります。

regress=# create table test ( x timestamp with time zone );
CREATE TABLE
regress=# insert into test (x) values ('2012-08-09 12:00:00 UTC+6:30');
INSERT 0 1
regress=# SET TIMEZONE = '-5:30';
SET
regress=# select * from test;
             x             
---------------------------
 2012-08-10 00:00:00+05:30
(1 row)

regress=# SET TIMEZONE = '-6:30';
SET
regress=# select * from test;
             x             
---------------------------
 2012-08-10 01:00:00+06:30
(1 row)

または、データベースがタイム ゾーン「-1:00」にあり、アプリケーションが日付を読み取るときにタイム ゾーンを削除しているため、日付が 1 時間ずれているように見える場合があります。入手可能な情報ではなんとも言えません。

あなたを本当に助けるためには、あなたが示すことが必要です:

  • 日付を挿入するコード
  • で有効にするINSERTことによってキャプチャされた日付を実際に挿入するステートメントと、セッションで.log_statement = 'all'postgresql.confSET TIMEZONEINSERT
  • SELECT後にデータベースからその列を ing した結果SET TIMEZONE = 'UTC'
  • 日付を読み取るコード
于 2012-08-12T05:29:56.467 に答える