我有一个提供议程功能的应用程序。
免责声明:我真的很喜欢 Rails 和 AR 的功能,这只是想问我下次如何更好地利用它的功能。
由于它必须由欧洲团队使用,它是使用 +0200 时间信息开发的。我知道时区的东西是由 AR 处理的,基础数据总是以 UTC 格式存储的。
我得到的问题(但我已经解决了,只是想获得一些反馈以便下次更好地思考)是,当我存储新约会时,我还在DateTime.parse
通话结束时强制执行“+0200”(例如DateTime.parse("#{day} #{hour} +0200")
,然后我将它设置为记录属性。当然10:00
存储08:00
在数据层内部,这很好。
Rome
然后,当我使用配置的 AR 时区(例如)检索该数据时@appointment.start_at
,当我们处于 CEST 夏令时时,使用类似的东西正确地转换回来。start_at
当设置为 CET (+0100) 日期时问题开始发生(但我总是将其存储在数据库中以强制执行 CEST +0200)。
数据库内部start_at
始终是相同的,因此08:00
在保存约会时始终使用 UTC 表示,10:00
但 AR 转换使用了错误的日光转换 (CET)。
我知道我可以通过简单地在 UTC 上工作来跳过这个,所以我不必考虑夏令时,但是 AR 本身无法记住我在 CEST 时存储它似乎有点混乱跑步。
执行查询时,我的操作与存储时相同,因此我将“+0200”附加到所有日期时间,然后一切都恢复正常,但是在显示时我需要检查时区是“CET”还是“CEST”并添加+1.hour
一个CET(否则会导致预约比预定时间提前 1 小时签署)。
- 我应该自己处理这件事对吗?
- AR 不应该能够执行这种检查,因为它包装了数据层?
- 下次我应该如何设计应用程序以避免此类问题,同时仍使用本地时区?(正如我所说,使用 UTC 也可能不适用于某些要求)
我想我下次应该把“+0200”换成“in_time_zone”,但我也允许用户手写一个小时来搜索,当然这总是同一时间,无论是“CET”还是“CEST” " 当然,我不能强制用户按照 UTC 格式编写。
谢谢,