web-dev-qa-db-ja.com

.icsファイルでの1日終日の予定

ASP.NETを使用してicsファイルを作成し、休日をOutlook 2007にインポートして、終日イベントフラグを設定しようとしています。これは複数日の休日では問題なく機能しますが、1日では登録されていないようです。真夜中から真夜中まで予約された「特異な休日」が表示されます。

[〜#〜] msdn [〜#〜] によると、開始時刻と終了時刻を00:00に設定するだけで十分です。 X-Microsoft-CDO-ALLDAYEVENTフラグとX-Microsoft-MSNCALENDAR-ALLDAYEVENTフラグも使用してみましたが、効果がないようです。

誰かが私が間違っているところを見ることができますか?以下にサンプル出力を含めました。

BEGIN:VCALENDAR
PRODID:-//Microsoft Corporation//Outlook 12.0 MIMEDIR//EN
VERSION:2.0
METHOD:PUBLISH
X-MS-OLK-FORCEINSPECTOROPEN:TRUE
BEGIN:VEVENT
CLASS:PUBLIC
DESCRIPTION:HOLIDAY\n
DTEND;VALUE=DATE:20090727
DTSTAMP:20091111T000000Z
DTSTART;VALUE=DATE:20090727
LAST-MODIFIED:20091111T000000Z
PRIORITY:5
SEQUENCE:0
SUMMARY;LANGUAGE=en-gb:HOLIDAY
TRANSP:OPAQUE
X-ALT-DESC;FMTTYPE=text/html:HOLIDAY
X-Microsoft-CDO-BUSYSTATUS:OOF
X-Microsoft-CDO-IMPORTANCE:1
X-Microsoft-DISALLOW-COUNTER:FALSE
X-MS-OLK-ALLOWEXTERNCHECK:TRUE
X-MS-OLK-CONFTYPE:0
X-Microsoft-CDO-ALLDAYEVENT:TRUE
X-Microsoft-MSNCALENDAR-ALLDAYEVENT:TRUE
END:VEVENT
END:VCALENDAR
28
wefwfwefwe

答えが見つかりました。終日のイベントを作成するには、翌日の午前0時に予約を終了する必要があります。

4
wefwfwefwe

@IceCoolは正しいです-DTENDを省略するだけでは十分ではありません...それが機能するかどうかは、DTSTARTのデータ型に依存します。

仕様によると、DTSTARTDATEデータ型があり、DTENDがない場合、イベントは開始日の終わりに終了します。ただし、DTSTARTに完全なDATE-TIMEデータ型があり、DTENDがない場合は、開始と同時に終了します。

RFC 5545のセクション3.6.1にあります( http://tools.ietf.org/html/rfc5545#page-54 ):

"VEVENT"カレンダーコンポーネントがDATE値タイプで "DTSTART"プロパティを指定し、 "DTEND"プロパティも "DURATION"プロパティも指定しない場合、イベントの期間は1日と見なされます。 "VEVENT"カレンダーコンポーネントが "DTSTART"プロパティを指定し、DATE-TIME値タイプは "DTEND"プロパティを指定しない場合、イベントは "DTSTART"プロパティで指定された同じカレンダーの日付と時刻で終了します。

つまり、終日イベントを取得するには、これでは不十分です。

DTSTART:20100101T000000

データタイプがDATE-TIMEであるため、機能せず、イベントの終了は開始と同じです。終日のイベントを作成するには、明示的にDTEND(タイプDATE-TIMEも)を追加する必要があります。

DTSTART:20100101T000000
DTEND:20100102T000000

または、DATEデータ型を使用すると、DTENDは不要になります。

DTSTART;VALUE=DATE:20100101
35
Mark Birbeck

上記のコメントRE:翌日の真夜中は、AppleのiCalでは機能しませんでした。これを回避するために、各BEGIN:VEVENTセクションで、次のように日付を出力しました。

DTSTART;VALUE=DATE:20100101
DTEND;VALUE=DATE:20100101

それでもMicrosoftタグが必要かどうかわかりません!?

23
BeesonBison

これを他の人のためにここに置いておくとグーグルです。特にGoogleカレンダーで、終日の予定と半日の予定の混合に問題がありました。

私の問題は、ICSファイルが強制的にダウンロードされていた方法に関連しています。ばかげて聞こえますが、ダウンロードを強制するヘッダーにより、Googleカレンダーが終日のイベントを適切に解析できませんでした。ブラウザへのストリーミングの方がより良い結果が得られました。ここに出力例を示します(VALUE = DATEを使用)。

BEGIN:VEVENT
UID:1248
DTSTART;VALUE=DATE:20151218
DTEND;VALUE=DATE:20151219
DTSTAMP:20151218T080000Z
CREATED:20151212T200409Z
DESCRIPTION:examplea
LAST-MODIFIED:20151218T080000Z
LOCATION:
SUMMARY:example summary
SEQUENCE:0
STATUS:CONFIRMED
TRANSP:OPAQUE
END:VEVENT
BEGIN:VEVENT
UID:1249
DTSTART;VALUE=DATE:20151217
DTEND;VALUE=DATE:20151218
DTSTAMP:20151217T080000Z
CREATED:20151212T200409Z
DESCRIPTION:example1
LAST-MODIFIED:20151217T080000Z
LOCATION:
SUMMARY:Example
SEQUENCE:0
STATUS:CONFIRMED
TRANSP:OPAQUE
END:VEVENT
2
Squiggs.

anmariの答えは、カレンダーとOutlook365の両方の現在のバージョンで最も正確であるようです。同じ開始と終了を入力した場合、それは真夜中の予定としてカレンダーに送られ、開始前日に終了する終日の予定としてOutlook365に送られます。両方で機能する唯一の方法は、終了日を開始日より1日遅くすることです。さらに、DTSTAMPを含めず、DTSTARTおよびDTENDを日付時刻形式ではなく日付形式にしてください。

0
Christi Palme

日付のフォーマット方法を変更しただけで、うまくいきました。

例えば。私はこれを持っていました:

DTSTART: " . date(ICAL_FORMAT, strtotime($event->date)) . "
DTEND:" . date(ICAL_FORMAT, strtotime($event->date)) . "

変更:

DTSTART:" . date('Ymd', strtotime($event->date)) . "
DTSTAMP:" . date('Ymd', strtotime($event->created_at)) . "
0
raison

MSDNについては不明ですが、最新のical仕様によると、1日終日のイベントは1日で始まり、翌日で終わります(真夜中ではなく、一日の終わりのように聞こえますが、00:00と見なされます。つまり、日、私は同じように思う)

最新の仕様RFC 5545では、終了日または終了=開始がない場合、それはちょっとした記念日であり、1日終日のイベントではありません。

Icsファイルを他の場所で使用したり、さらに伝達したりする場合は、これを正しく行うことをお勧めします。

これに関するメモ: http://icalevents.com/1778-all-day-events-adding-a-day-or-not/

0
anmari