2013-12-09 7 views
5

Я ищу для отображения данных в более чем одном часовом поясе в одном представлении в приложении Rails для системы времени и посещаемости. Немного контекста:Rails - обработка нескольких разных часовых поясов по тому же запросу

  • Мы делаем electronic time clocks. Люди, но они в своем бизнесе. Часы работы персонала и выход из него, и он записывает часы.
  • Временные часы толкают время, в течение которого кто-то набирал/удалял наш API в качестве времени unix (например, наша временная шкала времени Javascript захватывает часы во времени следующим образом: moment().unix()). Затем API сохраняет это в базе данных Postgres как timestamp without time zone.
  • Когда пользователь входит в систему на сайте, around_filter устанавливает соответствующий часовой пояс для запроса на основе настроек для этой организации пользователя.

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

Предположим, что наш менеджер находится в Сиднее, и это 11 утра. Они управляют тремя офисами: один в Сиднее, один в Брисбене (на один час после Сиднея во время летнего времени), и один в Аделаиде (полчаса за Сиднеем во время ДСТ). Сотрудники работали в трех офисах в 9 утра в свое местное время. Итак, на панели управления менеджером все часы часов должны отображаться как 9 утра. Однако, текущая реализация (с использованием round_filter) будет показывать время как 9 утра, 8 утра и 8:30 утра, соответственно, потому что они будут компенсированы с использованием временного пояса Сиднея.

Существует слой фильтрации, применяемый к персоналу из разных городов, поэтому можно сообщить системе, что человек А из Сиднея, человек B из Аделаиды, а человек C из Брисбена. Проблема, о которой я хотел бы посоветоваться, заключается в том, как лучше всего заставить Rails отображать смещение в разных часовых поясах максимально эффективно.

Бонусный кредит: а также время показа, нам также нужно прочитать ввод. Например, кто-то, возможно, проработал за 5 минут раньше, и их расписание должно быть исправлено. Если местный менеджер (т. Е. Кто-то в Брисбене) исправляет расписание для сотрудника из Брисбена, то это должно быть относительно легко управлять, поскольку мы знаем, что они находятся в Брисбене, мы можем просто установить часовой пояс запроса в Брисбен и позволить ActiveRecord сделать компенсируя нам. Но если генеральный менеджер (который находится в Сиднее, но управляет всеми часовыми поясами) хочет внести изменения, тогда мы должны иметь возможность правильно преобразовать их обратно в UTC в зависимости от их часового пояса. Любые предложения о том, как лучше всего сделать это, были бы замечательными.

Конкретный пример вопроса

В моей базе данных, моя таблица clock_ins выглядит следующим образом:

user_id (integer) | time (timestamp without time zone) 
------------------|----------------------------------- 
1     | "2012-09-25 22:00:00.0" 
2     | "2012-09-25 22:30:00.0" 
3     | "2012-09-25 23:00:00.0" 

И моя таблица пользователей выглядит следующим образом:

user_id (integer) | time_zone (varchar) 
------------------|----------------------------------- 
1     | "Sydney" 
2     | "Adelaide" 
3     | "Brisbane" 

(это является упрощением, на самом деле существует еще одно соединение между пользователем и их часовым поясом)

Если мы применим часовой пояс каждого пользователя к времени их часов, мы обнаружим, что они все в 9 утра по местному времени. то есть. 2012-09-25 23:00:00.0 в UTC 2012-09-26 09:00:00.0 в Брисбене (+1000). Общий подход в Rails заключается в использовании round_filter для установки часового пояса для запроса; если бы я сделал это здесь, каждое время будет отображаться через полчаса, что неверно. Поэтому я ищу советы по лучшим практикам при работе со временем из разных зон.

+0

Ваша формулировка сбивает с толку. В чем проблема? Не могли бы вы упростить свой вопрос? Предложение, начинающееся с «проблемы», имеет некоторые грамматические ошибки, из-за чего трудно понять, что вы пытаетесь сделать. Возможно, вы можете показать какой-то код для демонстрации? (BTW - Я также работаю с часами, поэтому я с удовольствием помогу, если я смогу понять ваш вопрос.) –

+0

@MattJohnson Спасибо - это предложение было ужасным - я переписал его. Я также добавил несколько конкретных примеров. –

+0

Я до сих пор не понимаю, какой у вас вопрос. Кажется, вы просто просите совета. Единственный бит, который я могу предложить, - следить за локальным преобразованием UTC во время переходного периода DST, поскольку результат может быть неоднозначным. Но если вы запрашиваете код Rails, возможно, вам следует показать, что вы пробовали, и сосредоточиться на одной конкретной проблеме. Он слишком широк, как вы в настоящее время сформулировали. –

ответ

4

Самый простой способ, который я вижу, - использовать метод Time.use_zone при рендеринге ваших времен. например

Time.use_zone('Sydney') { Time.current } 

Time.use_zone(person.office.time_zone) { person.clock_ins.last.time_stamp } 

Этого «Позволяет переопределение Time.zone локально внутри поставляемого блока; сбрасывает Time.zone к существующему значению, когда сделано.»

Смежные вопросы