【发布时间】:2013-12-26 01:10:20
【问题描述】:
我希望在 Rails 应用程序的同一视图中显示多个时区的数据,以用于考勤系统。一点上下文:
- 我们制作electronic time clocks。人们,但他们在他们的业务。员工上下班打卡,并记录他们的工作时间。
- 时钟将某人打卡/打卡的时间作为 unix 时间推送到我们的 API(例如,我们的 Javascript 时钟实现会及时抓取时钟,如下所示:
moment().unix())。然后 API 将其作为timestamp without time zone存储在 Postgres 数据库中。 - 当用户登录网站时,around_filter 会根据该用户所在组织的设置为请求设置适当的时区。
如果我们的组织跨越多个时区,就会出现问题。例如,在每个澳大利亚首府城市都设有办事处的企业将跨越三个时区(夏令时期间更多)。但是,中心办公室会有一个人需要检查整个组织的数据——我们称他们为经理。
假设我们的经理在悉尼,现在是上午 11 点。他们管理着三个办事处——一个在悉尼,一个在布里斯班(夏令时比悉尼晚一个小时),一个在阿德莱德(夏令时比悉尼晚半小时)。员工于当地时间上午 9 点在三个办公室打卡。因此,在经理的仪表板上,所有打卡时间都应显示为上午 9 点。 但是,当前的实现(使用 around_filter)将时间分别显示为上午 9 点、上午 8 点和上午 8:30,因为它们将使用悉尼时区进行偏移。
对来自不同城市的员工应用了一层过滤,因此可以告诉系统 A 来自悉尼,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 点。 IE。 2012-09-25 23:00:00.0 在 UTC 是 2012-09-26 09:00:00.0 在布里斯班 (+1000)。 Rails 中的一般做法是使用 around_filter 来设置请求的时区;如果我在这里这样做,每个时间都会间隔半小时显示,这是不正确的。因此,在处理不同区域的时间时,我正在寻找有关最佳实践的建议。
【问题讨论】:
-
您的措辞令人困惑。实际问题是什么?你能简化你的问题吗?以“问题”开头的句子有一些语法错误,这使您很难理解您要做什么。也许你可以展示一些代码来演示? (顺便说一句 - 我也使用时钟,所以如果我能理解你的问题,我很乐意提供帮助。)
-
@MattJohnson 谢谢——那句话太残忍了——我已经重写了。我还添加了一些更具体的示例。
-
我还是不明白你有什么问题。您似乎只是在寻求广泛的建议。我能提供的唯一一点是在 DST 回退过渡期间注意本地到 UTC 的转换,因为结果可能不明确。但是如果你要的是 Rails 代码,也许你应该展示你已经尝试过的东西并专注于一个特定的问题。正如您目前所说的那样,它太宽泛了。
标签: ruby-on-rails activerecord timezone