2011-04-21 61 views
23

Hice un sitio web para un cliente donde pueden publicar eventos. En lugar de crear manualmente archivos .ics de iCal para cada evento y cargarlo, pensé que sería mejor sacarlo de la base de datos y crear automáticamente un archivo .ics automáticamente con PHP.Crear .ics archivo dinámicamente

Puedo obtener información de la base de datos (no hay problema), pero al convertirla en una marca de tiempo para el archivo de calendario es difícil. Esto es lo que puedo almacenar en la base de datos:

Month: 05 
Day: 02 
Year: 2011 
Time: 11:30am - 1:30pm 

Aquí está el código para crear mis archivos .ics:

//This is the most important coding. 
header("Content-Type: text/Calendar"); 
header("Content-Disposition: inline; filename=adamhouston_$id.ics"); 

echo "BEGIN:VCALENDAR\n"; 
echo "PRODID:-//Microsoft Corporation//Outlook 12.0 MIMEDIR//EN\n"; 
echo "VERSION:2.0\n"; 
echo "METHOD:PUBLISH\n"; 
echo "X-MS-OLK-FORCEINSPECTOROPEN:TRUE\n"; 
echo "BEGIN:VEVENT\n"; 
echo "CLASS:PUBLIC\n"; 
echo "CREATED:20091109T101015Z\n"; 

echo "DESCRIPTION:Speaker: $event_query_row[speaker_name]\\n\\nTopic: $event_query_row[speaker_topic]\n"; 
echo "DTEND:20100208T040000Z\n"; 
echo "DTSTAMP:20100109T093305Z\n"; 
echo "DTSTART:20100208T003000Z\n"; 
echo "LAST-MODIFIED:20091109T101015Z\n"; 
echo "LOCATION:$event_query_row[location]\n"; 
echo "PRIORITY:5\n"; 
echo "SEQUENCE:0\n"; 
echo "SUMMARY;LANGUAGE=en-us:ADAM-Houston Event\n"; 
echo "TRANSP:OPAQUE\n"; 
echo "UID:040000008200E00074C5B7101A82E008000000008062306C6261CA01000000000000000\n"; 
echo "X-MICROSOFT-CDO-BUSYSTATUS:BUSY\n"; 
echo "X-MICROSOFT-CDO-IMPORTANCE:1\n"; 
echo "X-MICROSOFT-DISALLOW-COUNTER:FALSE\n"; 
echo "X-MS-OLK-ALLOWEXTERNCHECK:TRUE\n"; 
echo "X-MS-OLK-AUTOFILLLOCATION:FALSE\n"; 
echo "X-MS-OLK-CONFTYPE:0\n"; 
//Here is to set the reminder for the event. 
echo "BEGIN:VALARM\n"; 
echo "TRIGGER:-PT1440M\n"; 
echo "ACTION:DISPLAY\n"; 
echo "DESCRIPTION:Reminder\n"; 
echo "END:VALARM\n"; 
echo "END:VEVENT\n"; 
echo "END:VCALENDAR\n"; 

Ahora, ¿cómo puedo convertir los datos en mi base de datos para una marca de hora/fecha correcta?

Respuesta

18

veces iCal almacenados en UTC y no en la zona horaria que se originaron en menos que se especifique lo contrario (ver edición)

si desea que su código sea genérica que necesita para almacenar la zona horaria también. Si realmente quieres ... puedes codificar la conversión.

Yo también lo recomendaría no almacenar el tiempo en este formato:

Month: 05 
Day: 02 
Year: 2011 
Time: 11:30am - 1:30pm 

y pasar a un formato de hora. Pasarás de 4 (?) Columnas a una. ¿Por qué es esto bueno? ¡Porque puede usar php date() para formatear la fecha en lo que necesita exactamente! (Necesitará utilizar strtotime() que creo y también alguien tiene una función de conversión de zona horaria en los comentarios)

En cuanto a lo que hay que hacer desde una perspectiva iCal:

echo "DTSTAMP:<year><month><day>T<hour><minutes><seconds>Z\n"; // Time iCal item was made 
echo "DTSTART:<year><month><day>T<hour><minutes><seconds>Z\n"; // Start time 
echo "DTEND:<year><month><day>T<hour><minutes><seconds>Z\n"; // End time 

EDIT:
La Z representa la hora UTC o el tiempo absoluto.
Puede establecer la zona horaria en el archivo y dejar la conversión al programa de calendario.
http://tools.ietf.org/html/rfc5545#section-3.2.19