Расхождение между Системой и ДБ - PullRequest
0 голосов
/ 04 июня 2009

У меня есть приложение rails, и я храню все время в UTC в базе данных для целей различий в TimeZone. Кроме того, я удаляю запись вместо того, чтобы удалить ее, установив в таблице поле «ffective_end_date »на текущее время. Затем я использую именованную область видимости в модели следующим образом:

  named_scope :valid, :conditions => ['(effective_end_date IS NULL OR effective_end_date > ?) 
                                 AND (effective_start_date IS NULL OR effective_start_date < ?) ',Time.zone.now.gmtime, Time.zone.now.gmtime]

Похоже, что это нормально работает на моем компьютере Mac, но как только я перехожу на работу, кажется, что существует несоответствие между системным временем и временем, которое я не знаю почему !! Ввод команды «date» в Linux, кажется, дает правильное время. Глядя на файл журнала производства ниже:

sms parser(inparser) daemon is still running at Wed Jun 03 22:38:36 -0700 2009.
[4;35;1mUltrasmsin Load (0.5ms)ESC[0m   ESC[0mSELECT * FROM `smsin` WHERE ((effective_end_date IS NULL OR effective_end_date > '2009-06-04 05:28:32') 
 AND (effective_start_date IS NULL OR effective_start_date < '2009-06-04 05:28:32') ) 

Это сгенерированный запрос из следующих строк кода:

ActiveRecord::Base.logger.info "sms parser(inparser) daemon is still running at #{Time.now}.\n"
nonConvertedMsgs = Ultrasmsin.valid.find(:all)

Время первой команды, отображаемое из «Time.now», является правильным, но второе время (полученное из названной области видимости), похоже, неверно !! (выключено на 10 минут)

Это действительно озадачивает меня, так как я думаю, что Time.zone.now.gmtime просто конвертирует часы и не затрагивает минуты, но кажется, что часы конвертируются нормально в GM Time, но минуты отключены на 10 минут!

Есть идеи?

1 Ответ

1 голос
/ 04 июня 2009

На вашем компьютере для разработки Mac все - СУБД, Rails, браузер - возможно, работает в одном часовом поясе, и это ваш часовой пояс.

Возможно, на вашем рабочем компьютере что-то работает в другом часовом поясе. То, как СУБД обрабатывает различия между часовым поясом клиента и часовым поясом базы данных, зависит от СУБД. Некоторые работают в часовом поясе СУБД - независимо от того, какой часовой пояс был установлен в ее среде при запуске. Некоторые принимают во внимание часовой пояс клиента. Иногда нет простого способа найти часовой пояс клиента.

В общем, часовые пояса в современном мире кратны 1 часу по UTC. Есть исключения - и Индия (+05: 30), и Ньюфаундленд (-04: 30) кратны получасу от UTC, и Непал включен (+05: 45). Однако неправильная настройка часового пояса может сбить с толку.

Также помните, что часы на клиенте и сервере не могут быть синхронизированы с атомными часами где-либо, поэтому десятиминутный дрейф может быть вызван отсутствием службы SNTP (NTP) на машине.

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