Однодневные встречи на весь день в файлах.ics

Я создаю файл ics с помощью ASP.NET для импорта праздников в Outlook 2007 и пытаюсь установить флаг событий на весь день. Это хорошо работает в многодневные праздники, но в отдельные дни, кажется, не регистрируется, я просто забронировал "праздничный день" с полуночи до полуночи.

Согласно 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

7 ответов

Решение

Нашел ответ. Чтобы провести мероприятие на весь день, вам нужно завершить встречу в полночь следующего дня.

@IceCool прав - просто опуская DTEND недостаточно... это будет зависеть от типа данных DTSTART работает ли это.

Спецификация говорит, что если DTSTART имеет DATE Тип данных, и нет DTEND затем событие заканчивается в конце дня, когда оно начинается. Но если DTSTART имеет полный DATE-TIME Тип данных, и нет DTEND затем он заканчивается одновременно с началом.

Это в разделе 3.6.1 RFC 5545 ( http://tools.ietf.org/html/rfc5545):

В тех случаях, когда компонент календаря "VEVENT" указывает свойство "DTSTART" с типом значения "DATE", но без свойства "DTEND" или "DURATION", продолжительность события принимается равной одному дню. В тех случаях, когда компонент календаря "VEVENT" указывает свойство "DTSTART" с типом значения "DATE-TIME", но без свойства "DTEND", событие заканчивается в ту же календарную дату и время дня, которое указано в свойстве "DTSTART".

Итак, в итоге, чтобы получить событие на весь день, этого недостаточно:

DTSTART:20100101T000000

Это не работает, потому что тип данных DATE-TIMEи, таким образом, конец события совпадает с началом. Чтобы сделать событие на весь день, вам нужно либо добавить явное DTEND (также типа DATE-TIME):

DTSTART:20100101T000000
DTEND:20100102T000000

или используйте DATE тип данных, и тогда нет необходимости DTEND:

DTSTART;VALUE=DATE:20100101

Приведенный выше комментарий RE: полночь послезавтра у меня не сработала в Apple iCal. Чтобы обойти это, в каждом из разделов BEGIN:VEVENT я вывел следующие даты:

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

Я не знаю, если вам все еще нужны теги Microsoft, хотя?!

Оставив это здесь для всех, кто гуглит... У меня были проблемы с тем же, смесью событий всего дня и полдня, особенно в Календаре 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

Я просто изменил способ форматирования даты, и у меня это сработало.

Например. У меня было такое:

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)) . "

Ответ Анмари представляется наиболее точным для текущей версии календаря и Outlook365. Если кто-то вводит начало и конец, которые совпадают, он входит в Календарь как полночное событие и переходит в Outlook365 как событие на весь день, которое заканчивается за день до его начала. Единственный способ для него работать с обоими - это чтобы дата окончания была на один день позже начала. Кроме того, не включайте DTSTAMP и поместите DTSTART и DTEND в формат даты, а не в формат даты и времени.

Не уверен насчет MSDN, но в соответствии с последними техническими характеристиками, однодневное событие в течение всего дня начинается в 1 день и заканчивается следующим (не полночь, которая звучит как конец дня, но предполагается, что это 00:00, т.е. начало день, похоже я полагаю)

В последней спецификации RFC 5545, если у человека нет даты окончания или окончания = начала, то это своего рода годовщина, а не событие одного дня в течение всего дня.

Если ваши файлы ics будут использоваться в другом месте или распространяться дальше, то стоит попытаться сделать это правильно.

Примечание об этом здесь: http://icalevents.com/1778-all-day-events-adding-a-day-or-not/

Я знаю, что я очень опоздал на вечеринку, но в соответствии с оригинальным RFC, событие DTSTART определяется на весь день без DTEND. Это работает для меня в Outlook 2007 и Google.

Другие вопросы по тегам