Однодневные встречи на весь день в файлах .ics - PullRequest
26 голосов
/ 11 ноября 2009

Я создаю файл 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

Ответы [ 8 ]

32 голосов
/ 15 мая 2015

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

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

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

Для случаев, когда компонент календаря «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
23 голосов
/ 08 сентября 2010

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

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

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

4 голосов
/ 12 ноября 2009

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

2 голосов
/ 12 декабря 2015

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

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

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

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 голосов
/ 13 февраля 2019

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

0 голосов
/ 07 мая 2014

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

0 голосов
/ 22 сентября 2010

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

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

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

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

...