【发布时间】:2013-09-15 09:23:36
【问题描述】:
对,这对我来说有点混乱,所以我要尝试从顶部解释!
我有一个 Rails 网络应用程序。这是一个内部公司应用程序,仅在英国使用。 该应用程序所做的其中一件事是管理会议。 会议有开始的日期和时间。表单上有一个日期/时间选择器,允许用户选择会议的日期和时间。我将这个日期原样保存到数据库中。所有会议持续 2 小时,因此结束时间只需开始 + 2 小时。
例子:
2013-06-23 6:45PM in the form is stored in the db as 2013-06-23 18:45:00
2013-12-23 6.45pm in the form is stored in the db as 2013-12-23 18:45:00
请注意,第一个日期在夏令时 (BST) 期间,第二个日期在 GMT 期间。我实际上不在乎是格林威治标准时间还是英国夏令时:会议绝对是在那个时间举行的。
在 rails webapp 中,我只需从数据库中打印出确切的日期和时间——当然,格式很好!
现在,有时我会向会议的组织者以及与他们会面的人发送一封电子邮件。这封电子邮件告诉他们会议的日期和时间等,还包括一个 iCal (.ics) 文件供他们放入他们的(通常是 Outlook,但也包括 Apple 或 gmail)日历。
我遇到的问题是(使用上述示例)Outlook 显示的会议如下:
Meeting #1: Start: 23/06/2013 7:45pm, End: 23/06/2013 9:45pm
Meeting #2: Start: 23/12/2013 6:45pm, End: 23/12/2013 8:45pm
请注意,由于 BST/GMT 的问题,它已经调整了第一个。
.ics 文件的文本包含以下代码:
第 1 次会议:
BEGIN:VCALENDAR
...
DTEND:20130623T204500Z
DTSTART:20130623T184500Z
...
END:VCALENDAR
会议 #2:
BEGIN:VCALENDAR
...
DTEND:20131223T204500Z
DTSTART:20131223T184500Z
...
END:VCALENDAR
所以我使用 Z 时区 (UTC) 对日期/时间进行编码。我理解这就是为什么 Outlook 错误地将 UTC 时间转换为 #1 的 BST 时间而单独留下 #2(因为 GMT == UTC)
我的问题是:如何阻止这种情况发生?我希望安排会议的时间是绝对的实际时间,无论 GMT/BST:下午 6:45
我应该将日期时间作为 UTC 存储在数据库中吗?这将如何完成(我假设它适用于所有日期,而不仅仅是会议开始日期)。当我在 webapp 中显示它们时,如何将它们重新转换回 实际 日期时间?
额外: 我的初始化程序/time_formats.rb 中有一个条目,如下所示:
:ical => "%Y%m%dT%H%M00Z"
所以日期会像“20130623T184500Z”一样出现。我在构建 ics 时使用它。我认为这是问题所在 - 如果日期/时间在 BST 期间,我不想使用 Z,而是使用其他东西?
【问题讨论】:
-
说到在数据库中将日期存储为UTC,DB字段是MSSQL datetime。该字段中没有任何内容来指示 UTC 偏移量......那么如何知道是否加/减一个小时?
-
rails c
d = DateTime.now=> Wed, 11 Sep 2013 12:25:10 +0100d.utc=> Wed, 11 Sep 2013 11:25:10 +0000所以我可以在保存到数据库之前将日期转换为UTC。如何撤消检索时的转换? -
请注意(在阅读了 Rails 默认情况下在数据库中使用 UTC 之后):我没有在任何地方配置任何与时区相关的东西 - 这就是日期/时间一直以来的工作方式(保存它们按原样),我认为它是默认的。
标签: ruby-on-rails utc dst icalendar