そうですね、ちょっとややこしいので上から説明してみます!
私はRails Webアプリを持っています。これは社内アプリであり、英国でのみ使用されます。アプリが行うことの 1 つは、会議の管理です。ミーティングには開始日時があります。フォームには日付/時刻ピッカーがあり、ユーザーは会議の日付と時刻を選択できます。この日付をそのままデータベースに保存します。すべての会議は 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) の期間で、2 番目の日付は GMT の期間であることに注意してください。それがGMTであろうとBSTであろうと、実際には気にしません。会議は絶対にその時間に行われます。
Rails webapp 内では、DB から正確な日付と時刻を出力するだけです。もちろん、適切にフォーマットされています!
さて、ある時点で、会議の主催者と会議の相手に電子メールを送信します。この電子メールには、会議の日時などが記載されており、(通常は Outlook ですが、Apple または gmail も) カレンダーに入れるための iCal (.ics) ファイルも含まれています。
私が抱えている問題は、(上記の例を使用して) 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 が #1 の UTC 時間を BST 時間に誤って変換し、#2 をそのままにしておく理由を理解しています (GMT == UTC のため)。
私の質問は、どうすればこれを止めることができますか? GMT/BST に関係なく、会議の予定時刻を絶対的な実際の時刻にしたい: 午後 6 時 45 分
日時を UTC として DB に保存する必要がありますか? これはどのように行われますか (会議の開始日だけでなく、すべての日付に適用されると思います)。そして、それらをwebappに表示するときにそれらを実際の日時に再変換する方法は?
おまけ: initializers/time_formats.rb に次のようなエントリがあります:
:ical => "%Y%m%dT%H%M00Z"
したがって、日付は「20130623T184500Z」のようになります。私はicsを構築するときにこれを使用します。そして、これが問題だと思います-日付/時刻がBST中にある場合、Zを使用したくないのですが、何か他のものはありますか?