Странные несоответствия времени между производством и разработкой - PullRequest
2 голосов
/ 13 сентября 2009

По некоторым причинам времена появляются по-разному в разработке (мой локальный Mac) и производстве (Heroku). Посмотрите: (Просто перед этим я сделал heroku db:pull, поэтому базы данных должны быть идентичны)

Производство (Heroku)

>> Annotation.last.id
=> 2028
>> Annotation.last.created_at
=> Sat, 12 Sep 2009 06:51:33 UTC +00:00
>> Time.zone
=> #<ActiveSupport::TimeZone:0x2b4972a4e2f0 @tzinfo=#<TZInfo::DataTimezone: Etc/UTC>, @utc_offset=0, @name="UTC">
>> Time.now.zone
=> "PDT"

Разработка (мой Macbook Pro)

>> Annotation.last.id
=> 2028
>> Annotation.last.created_at
=> Sat, 12 Sep 2009 09:51:33 UTC +00:00
>> Time.zone
=> #<ActiveSupport::TimeZone:0x23c92c0 @tzinfo=#<TZInfo::DataTimezone: Etc/UTC>, @utc_offset=0, @name="UTC">
>> Time.now.zone
=> "EDT"

Поскольку время created_at отличается на 3 часа, я предполагаю, что это связано с разницей в 3 часа между EDT и PDT, но я не уверен, что происходит.

РЕДАКТИРОВАТЬ: Вот как выглядят необработанные данные:

sqlite> Select created_at from annotations where id = 2028;
2009-09-12T09:51:33-04:00

Ответы [ 5 ]

4 голосов
/ 02 ноября 2009

Похоже, это проблема при перемещении баз данных между Heroku и вашей машиной для разработки. Выполнение SQL-запроса напрямую дает мне следующее:

Local: {"created_at"=>"2009-10-30 22:34:55.919586"}

Remote: {"created_at"=>"2009-10-31 01:34:55.919586"}

Та же проблема, ровно трехчасовая смена. Просматривая источник для Taps, Gem heroku использует для синхронизации БД, не дает никаких подсказок о том, что здесь может пойти не так. Я открыл заявку в службу поддержки heroku, и я обновлю этот пост тем, что нашел.

UPDATE: Рикардо и Мортен из Героку ответили. Укажите TZ в командной строке следующим образом:

TZ=America/Los_Angeles heroku db:pull
1 голос
/ 13 сентября 2009

Похоже, предполагается, что даты в БД хранятся в вашем местном часовом поясе, который отличается для двух сред, а затем переводит их в UTC. поскольку значение в БД практически одинаковое, вы получаете 2 разных значения UTC.

Какое значение config.time_zone из вашего "config / environment.rb"? Также, каково значение «Выбрать созданный_аноним из аннотаций, где id = 2028»?

0 голосов
/ 20 сентября 2009

Это не может объясняться тем или иным сообщением своего местного времени как времени UTC: восточное время составляет 4 часа от UTC, а тихоокеанское время - 7 часов, но вы видите разницу в три часа , а не 4- или 7-часовая разница.

Кажется, что они оба производят неправильный вывод. SQLite ясно говорит, что время 09:51 должно быть -04: 00, то есть восточное время, но Rails неправильно утверждает, что это UTC в одном случае - а в другом случае он переводит его с восточного на тихоокеанский , а затем неправильно утверждая, что результатом является UTC.

Может быть, это ошибка в SQLite для ActiveRecord? Потому что это похоже на то, что было бы давно поймано и уничтожено, если бы оно было в широко используемом коде.

0 голосов
/ 18 сентября 2009

Возможно, одна или обе машины имеют системное время, установленное на местный часовой пояс вместо UTC. Если это так, то было бы непонятно, какое значение на самом деле имеет время UTC (int).

На обеих машинах нужно проверить несколько областей:

  • системный часовой пояс
  • часовой пояс местного (пользовательского) процесса
  • база данных системного часового пояса
  • база данных местного часового пояса
0 голосов
/ 15 сентября 2009

Это проблема, с которой я сталкивался и раньше.

Если вы сделаете что-то вроде Annotation.last.created_at в консоли rails, к результату уже применен часовой пояс. Вы должны посмотреть на «чистую» дату в MySQL через консоль MySQL: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...