当夏令时变化时,ActiveRecord处理奇怪的时区

时间:2013-10-25 09:33:32

标签: ruby-on-rails ruby-on-rails-3 datetime activerecord

我有一个提供议程功能的应用程序。

免责声明:我真的很喜欢Rails和AR的功能,这只是为了问我下次如何更好地利用它的功能。

由于它必须由欧洲团队使用,因此它使用+0200计时信息开发。我知道时区内容由AR处理,基本数据始终以UTC格式存储。

我得到的问题(但我已经解决了,只是希望得到一些反馈,以便下次更好地考虑)是当我存储新约会时我也会在{{1}的末尾强制执行“+0200”调用(es。DateTime.parse然后我将其设置为记录属性。当然DateTime.parse("#{day} #{hour} +0200")在数据层中存储为10:00,这很好。

然后当我使用配置的AR时区(例如08:00)使用类似Rome之类的内容检索数据时,当我们处于CEST白天时间时,它会正确转换回来。当@appointment.start_at设置为CET(+0100)日期时,问题就开始发生(但我总是将其存储在强制执行CEST +0200的数据库中)。

数据库start_at内部始终相同,因此在使用start_at保存约会时,UTC表示始终为08:00,但AR转换使用错误的日光转换(CET)。

我知道我可以通过简单地在UTC上工作来跳过这一点,所以我不必对夏令时进行任何考虑,但AR本身无法以某种方式记住我存储它似乎有点混乱而CEST正在运行。

执行查询时我和存储时一样,所以我将“+0200”附加到所有DateTimes,并且所有日期时间都重新开始,但是在显示时我需要检查TimeZone是“CET”还是“CEST”并且向CET添加10:00(否则会导致约会在预定时间前1小时签署)。

  1. 我应该自己处理这件事吗?
  2. 不应该AR能够执行这种检查,因为它包装了数据层吗?
  3. 下次如何设计应用程序以避免此类问题,同时仍然使用本地时区? (正如我所说,使用UTC也可能不适用于某些要求)
  4. 我想我下次应该用“in_time_zone”更改“+0200”,但我也允许用户手动写一小时进行搜索,当然这也是同时“CET”或“CEST”,当然我不能强制用户按照UTC格式编写。

    谢谢,

0 个答案:

没有答案