web-dev-qa-db-fra.com

Un seul jour de rendez-vous toute la journée dans des fichiers .ics

Je crée un fichier ics en utilisant ASP.NET pour importer des vacances dans Outlook 2007 et essayer de définir l'indicateur d'événement toute la journée. Cela fonctionne très bien pour les vacances de plusieurs jours, mais pour les journées simples, il semble que l'enregistrement ne soit pas enregistré. Je viens de recevoir un «séjour à la singularité» réservé de minuit à minuit.

Selon MSDN , définir les heures de début et de fin à 00:00 devrait suffire. J'ai également essayé d'utiliser les indicateurs X-Microsoft-CDO-ALLDAYEVENT et X-Microsoft-MSNCALENDAR-ALLDAYEVENT, mais ils ne semblent pas avoir d'effet.

Quelqu'un peut-il voir où je vais mal? J'ai inclus exemple ci-dessous.

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
24
wefwfwefwe

trouvé la réponse. pour faire de la journée un événement, il faut que le rendez-vous se termine à minuit le lendemain.

3
wefwfwefwe

@IceCool a raison - omettre simplement la DTEND ne suffit pas ... cela dépendra du type de données DTSTART si cela fonctionne.

La spécification indique que si DTSTART a un type de données DATE et qu'il n'y a pas de DTEND, l'événement se termine à la fin du jour où il commence. Mais si DTSTART a un type de données DATE-TIME complet et s'il n'y a pas de DTEND, il se termine au même moment où il commence.

C'est dans la section 3.6.1 de la RFC 5545 ( http://tools.ietf.org/html/rfc5545#page-54 ):

Dans les cas où un composant de calendrier "VEVENT" spécifie une propriété "DTSTART" avec un type de valeur DATE mais pas de propriété "DTEND" ni "DURATION", la durée de l'événement est considérée comme étant d'un jour. Dans les cas où un composant de calendrier "VEVENT" spécifie une propriété "DTSTART" avec un type de valeur DATE-TIME mais pas de propriété "DTEND", l'événement se termine à la même date et à l'heure spécifiées par la propriété "DTSTART".

Donc, le résultat est que, pour obtenir un événement d'une journée, cela ne suffit pas:

DTSTART:20100101T000000

Cela ne fonctionne pas car le type de données est DATE-TIME et la fin de l'événement est donc identique à son début. Pour créer un événement d'une journée, vous devez soit ajouter une DTEND explicite (également de type DATE-TIME):

DTSTART:20100101T000000
DTEND:20100102T000000

ou utilisez le type de données DATE, et il n'y a alors pas besoin de DTEND:

DTSTART;VALUE=DATE:20100101
30
Mark Birbeck

Le commentaire ci-dessus RE: minuit le lendemain n'a pas fonctionné pour moi dans iCal d'Apple. Pour résoudre ce problème, dans chacune des sections BEGIN: VEVENT, j’ai sorti les dates comme suit:

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

Je ne sais pas si vous avez toujours besoin des balises Microsoft?!

23
BeesonBison

Laissant cela ici pour quelqu'un d'autre googler .. J'ai eu du mal avec le même, mélange d'événements toute la journée et demi-journées en particulier dans Google Agenda. 

Mon problème était lié au téléchargement forcé du fichier ICS. Cela semble idiot, mais un en-tête qui a forcé le téléchargement a empêché Google Agenda d'analyser correctement tous les événements de la journée. Streaming sur le navigateur avait de meilleurs résultats. Exemple de sortie ici. (utilisez VALUE = DATE) pour les événements uniques toute la journée.

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.

la réponse d'Anmari semble être la plus précise pour la version actuelle de Calendar et Outlook365. Si vous indiquez un début et une fin identiques, il entre dans Calendrier en tant qu'événement de minuit, puis dans Outlook365 en tant qu'événement toute la journée qui se termine le jour précédent. La seule façon pour que cela fonctionne avec les deux est que la date de fin soit un jour plus tard que le début. De plus, n'incluez pas DTSTAMP et mettez DTSTART et DTEND au format de date et non au format date-heure.

0
Christi Palme

Pas sûr de MSDN, mais selon la dernière spécification ical, un événement d'une journée entière commence le lendemain et se termine le lendemain (pas à minuit, ce qui ressemble à une fin de journée, mais est supposé être 00:00, c'est-à-dire au début de la journée. jour, semblable je suppose)

Dans la dernière spécification RFC 5545, s'il n'y a pas de date de fin ou de fin = début, il s'agit en quelque sorte d'un anniversaire - et non d'un événement d'une journée entière.

Si vos fichiers ics doivent être utilisés ailleurs ou déplacés davantage, il vaut la peine d'essayer de faire les choses correctement.

Une note à ce sujet ici: http://icalevents.com/1778-all-day-events-adding-a-day-or-not/

0
anmari