web-dev-qa-db-ja.com

icalendarで使用されるVTIMEZONEは何ですか?なぜUTC時間だけではないのですか?

Icalendarで使用されるVTIMEZONEは何ですか?

例えば1

BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Apple Inc.//Mac OS X 10.12.3//EN
CALSCALE:GREGORIAN
BEGIN:VTIMEZONE
TZID:Asia/Shanghai
BEGIN:STANDARD
TZOFFSETFROM:+0900
RRULE:FREQ=YEARLY;UNTIL=19910914T150000Z;BYMONTH=9;BYDAY=3SU
DTSTART:19890917T000000
TZNAME:GMT+8
TZOFFSETTO:+0800
END:STANDARD
BEGIN:DAYLIGHT
TZOFFSETFROM:+0800
DTSTART:19910414T000000
TZNAME:GMT+8
TZOFFSETTO:+0900
RDATE:19910414T000000
END:DAYLIGHT
END:VTIMEZONE
BEGIN:VEVENT
TRANSP:OPAQUE
LAST-MODIFIED:20170305T083916Z
UID:[email protected]
DTSTAMP:20170305T083916Z
LOCATION:Cell Group
DESCRIPTION:
STATUS:CONFIRMED
SEQUENCE:0
SUMMARY:Study Bible
DTSTART;TZID=Asia/Shanghai:20170324T193000
DTEND;TZID=Asia/Shanghai:20170324T213000
X-Apple-TRAVEL-ADVISORY-BEHAVIOR:AUTOMATIC
CREATED:20160312T140632Z
RRULE:FREQ=WEEKLY;BYDAY=FR
BEGIN:VALARM
X-WR-ALARMUID:9B47E27E-9063-417E-B488-409387A3201A
UID:9B47E27E-9063-417E-B488-409387A3201A
TRIGGER;VALUE=DATE-TIME:19760401T005545Z
ACKNOWLEDGED:20161125T105826Z
X-Apple-DEFAULT-ALARM:TRUE
ACTION:NONE
END:VALARM
END:VEVENT
END:VCALENDAR

iCalendarのドキュメントから

VTIMEZONE:タイムゾーンを定義するコンポーネントプロパティのグループ化を提供します。

1. VTIMEZONEの定義は何ですか?

場所の冬時間と夏時間を記述するルールはありますか?

2. VTIMEZONEは何に使用されますか?

IcalendarオブジェクトでVTIMEZONEコンポーネントを指定する必要はありません。代わりに、ローカル時間をutc時間に変換し、icalendarイベントをエクスポートします。

# Before
DTSTART:20170324T113000Z
DTEND:20170324T130000

# After
DTSTART;TZID=Asia/Shanghai:20170324T193000
DTEND;TZID=Asia/Shanghai:20170324T213000

2.1これは理にかなっていますか? VTIMEZONEのないicalendarオブジェクト

BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Apple Inc.//Mac OS X 10.12.3//EN
BEGIN:VEVENT
TRANSP:OPAQUE
LAST-MODIFIED:20170305T083916Z
UID:[email protected]
DTSTAMP:20170305T083916Z
LOCATION:Cell Group
DESCRIPTION:
STATUS:CONFIRMED
SEQUENCE:0
SUMMARY:Study Bible
DTSTART;TZID=Asia/Shanghai:20170324T113000
DTEND;TZID=Asia/Shanghai:20170324T213000
X-Apple-TRAVEL-ADVISORY-BEHAVIOR:AUTOMATIC
CREATED:20160312T140632Z
RRULE:FREQ=WEEKLY;BYDAY=FR
BEGIN:VALARM
X-WR-ALARMUID:9B47E27E-9063-417E-B488-409387A3201A
UID:9B47E27E-9063-417E-B488-409387A3201A
TRIGGER;VALUE=DATE-TIME:19760401T005545Z
ACKNOWLEDGED:20161125T105826Z
X-Apple-DEFAULT-ALARM:TRUE
ACTION:NONE
END:VALARM
END:VEVENT
END:VCALENDAR

2.2これが理にかなっている場合、VTIMEZONEの使用法は何ですか?

3. VTIMEZONEとVEVENTの整合性

たとえばたとえば1。

....
BEGIN:VTIMEZONE
TZID:Asia/Shanghai                           <- Part 1
.....
END:VTIMEZONE


BEGIN:VEVENT
....
DTSTART;TZID=Asia/Shanghai:20170324T193000   <- Part 2
DTEND;TZID=Asia/Shanghai:20170324T213000     <- Part 3
....
END:VEVENT

3.1。 VEVENTのタイムゾーンはVTIMEZONEと一致している必要がありますか?

3.2他のタイムゾーンを使用してパート2とパート3の時間を記述できますか?

例えば.

....
BEGIN:VTIMEZONE
TZID:Asia/Shanghai                           <- Part 1
.....
END:VTIMEZONE


BEGIN:VEVENT
....
DTSTART:20170324T193000Z   <- Part 2 UTC time
DTEND:20170324T213000Z     <- Part 3 UTC Time
....
END:VEVENT
12
Ryan Lv

1。VTIMEZONEの定義は何ですか?

VTIMEZONEは、タイムゾーンが任意の時点(つまり、夏時間であるときと標準時間であるとき)で持つUTCオフセットの特定のルールを格納するために使用されます。

2。VTIMEZONEの用途は何ですか?

これは、UTCではなく特定のタイムゾーンでiCalendar全体のさまざまなタイムスタンプをフォーマットする場合に使用されます。

あなたは尋ねるかもしれません:すべての場所でUTCを使用しないのはなぜですか?それはより単純ではないでしょうか?答えは、タイムゾーンが必要なため繰り返しルールです。繰り返しイベントがあり、そのイベントが夏時間/標準の境界を超える場合、そのイベントのタイムゾーンを指定する必要があります。 UTCを使用したばかりの場合、日光/標準境界を通過すると、イベントの時刻が不正確になります。

2.1これは意味がありますか?VTIMEZONEなしのicalendarオブジェクト

あなたの例は間違っています。

この例のDTENDプロパティは、存在しないVTIMEZONEコンポーネント( "Asia/Shanghai")を参照しています。

DTEND;TZID=Asia/Shanghai:20170324T213000

ICalendarパーサーはそのTZIDパラメータを調べ、次に、TZIDプロパティがそれに一致するVTIMEZONEコンポーネントを探します。 iCalendarオブジェクトにはそのようなVTIMEZONEがないため、iCalendarパーサーは技術的にその日付を解釈する方法を知りません。 TZIDパラメーターは単に一意の識別子として扱われます。それ自体には意味がありません。

特定のタイムゾーンで日付をフォーマットしたいが、iCalendarオブジェクトにVTIMEZONEコンポーネントを含めたくない場合は、グローバルタイムゾーンIDを使用できます。グローバルタイムゾーンIDはスラッシュで始まるため、通常のTZIDパラメーターとは異なります。

DTEND;TZID=/Asia/Shanghai:20170324T213000

グローバルタイムゾーンIDの欠点は、iCalendar仕様がこれらのIDがパーサーによって解釈されることになっている方法を指定しないことです。ただし、実際には、グローバルIDをサポートするすべてのパーサーのうち、それらのほとんどはおそらくそれらをOlson IDとして扱うと思います。

.1。VEVENTのタイムゾーンはVTIMEZONEと一致している必要がありますか?

VTIMEZONEコンポーネントで定義されたタイムゾーンは、iCalendarオブジェクト全体にグローバルスコープを持っています。したがって、VEVENT内のTZIDパラメータは、VTIMEZONEコンポーネントを参照する必要があります(グローバルタイムゾーンIDを除く)。

.2他のタイムゾーンを使用してパート2とパート3の時間を記述できますか?

ICalendarオブジェクトにVTIMEZONEコンポーネントがあるからといって、それを使用する必要があるわけではありません。あなたの例は有効です。

15
Michael