对,这对我来说有点混乱,所以我将尝试从顶部解释!
我有一个 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,但还有别的吗?