Creando un archivo VCS a través de C# pero a Outlook o C# no les gustan mis fechas

Estoy tratando de crear un archivo .vcs en C#. Básicamente, en Outlook, si agrega una cita de calendario, se crea un archivo que en Outlook se ve así:

enter image description here

De hecho, puede exportar este archivo, hacer clic derecho sobre él y abrirlo en su editor de texto favorito. Se ve algo como esto:

BEGIN:VCALENDAR
PRODID:-//Flo Inc.//FloSoft//EN
BEGIN:VEVENT
DTSTART:6/12/2012 12:00:00 PM
DTEND:6/12/2012 1:00:00 PM
LOCATION:Meeting room 1
DESCRIPTION;ENCODING=QUOTED-PRINTABLE:Learn about assets.
SUMMARY:asset management training.
X-MICROSOFT-CDO-BUSYSTATUS:OOF
PRIORITY:5
END:VEVENT
END:VCALENDAR

Entonces, tengo un problema con el tiempo real en DTSTART y DTEND desde arriba. Puede ver que cuando abro el archivo de Outlook dice 11:00 a. m. (como muestra la captura de pantalla), pero en el archivo de texto tengo las 12:00 p. m.

Entonces tengo una aplicación (aplicación de entrenamiento) donde creo dinámicamente uno de estos archivos vcs. Usando C #, recopilo el tema, la ubicación, la descripción y las fechas (con horas) así:

 protected void btnOutlook_Click(object sender, EventArgs e)
        {
            string location;
            string description;
            string subject;
            string fromTime;
            string toTime;

            location = txtLocation.Text;
            description = txtDescription.Text;
            subject = lblTitle.Text;
            fromTime = ddlFromTimeHH.SelectedItem.Text + ":" + ddlFromTimeMM.SelectedItem.Text + ddlFromTimeAMPM.SelectedItem.Text;
            toTime = ddlToTimeHH.SelectedItem.Text + ":" + ddlToTimeMM.SelectedItem.Text + ddlToTimeAMPM.SelectedItem.Text;

            string begin = lblDate.Text + " " + fromTime;
            string end = lblDate.Text + " " + toTime;
            string format = "dd/MM/yyyy h:mmtt";

            DateTime trainingDateBegin;
            DateTime trainingDateEnd;

            if (DateTime.TryParseExact(begin, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out trainingDateBegin))
            {
                //good date
            }


            if (DateTime.TryParseExact(end, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out trainingDateEnd))
            {
                //good date
            }

            OpenVCSFile("vcsFile.aspx?TrainingDateBegin=" + trainingDateBegin + "&TrainingDateEnd=" + trainingDateEnd + "&Location=" + location + "&Subject=" + subject + "&Description=" + description, "Utilities", "toolbar=0,scrollbars=1,location=0,statusbar=0,menubar=0,resizable=0,width=800,height=500,left=10,top=20");
        }

Entonces, en el código anterior, fromTime se convierte, por ejemplo, en 7:00 am y toTime se convierte en algo así como 8:00 am. Luego uso DateTime.TryParseExact para fusionar la fecha con la hora para que se convierta, por ejemplo, en 06/01/2012 7:00 am para beginDate y para endDate se convierte por ejemplo 06/01/2012 8:00 am.

Hasta ahora, todo bien ... luego solo llamo a una función OpenVCSFile, que es solo un javascript para abrir la URL pasada de esta manera:

protected void OpenVCSFile(string url, string name, string att)
        {
            Response.Write("<script language='JavaScript'>");
            Response.Write("x=window.open('" + url + "', '" + name + "','" + att + "');");
            Response.Write("x.focus();");
            Response.Write("</script>");
        }

Esto entonces llama a la vcsFile.aspx página donde puedo completar los valores de perspectiva...

protected void Page_Load(object sender, EventArgs e)
        {
            DateTime beginDate;
            DateTime endDate;
            string location;
            string description;
            string subject;

            beginDate = Convert.ToDateTime(Request.QueryString["TrainingDateBegin"]);
            endDate = Convert.ToDateTime(Request.QueryString["TrainingDateEnd"]);

            location = Request.QueryString["Location"];
            description = Request.QueryString["Description"];
            subject = Request.QueryString["Subject"];

            MemoryStream mStream = new MemoryStream();
            StreamWriter writer = new StreamWriter(mStream);

            writer.AutoFlush = true;

            //header
            writer.WriteLine("BEGIN:VCALENDAR");
            writer.WriteLine("PRODID:-//Flo Inc.//FloSoft//EN");
            writer.WriteLine("BEGIN:VEVENT");

            //BODY
            writer.WriteLine("DTSTART:" + beginDate);   //why dont the times come out right...
            writer.WriteLine("DTEND:" + endDate);       //same here
            writer.WriteLine("LOCATION:" + location);
            writer.WriteLine("DESCRIPTION;ENCODING=QUOTED-PRINTABLE:" + description);
            writer.WriteLine("SUMMARY:" + subject);
            writer.WriteLine("X-MICROSOFT-CDO-BUSYSTATUS:OOF");

            //FOOTER
            writer.WriteLine("PRIORITY:5");
            writer.WriteLine("END:VEVENT");
            writer.WriteLine("END:VCALENDAR");

            //MAKE IT DOWNLOADABLE
            Response.Clear(); //clears the current output content from the buffer
            Response.AppendHeader("Content-Disposition", "attachment; filename=AddToOutlookCalendar.vcs");
            Response.AppendHeader("Content-Length", mStream.Length.ToString());
            Response.ContentType = "application/download";
            Response.BinaryWrite(mStream.ToArray());
            Response.End();
        }

Todo parece funcionar EXCEPTO la parte más importante, la sección donde hago esto:

writer.WriteLine("DTSTART:" + beginDate);   //why dont the times come out right...
 writer.WriteLine("DTEND:" + endDate);       //same here

La fecha sale tal como se ve en la captura de pantalla de Outlook, pero la hora siempre es incorrecta... Por lo general, Outlook lo abrirá entre las 10:00 a. m. y las 11:00 a. m. Pero nunca toma el tiempo que le doy. Por ejemplo, en mi código C# aquí está la pantalla del reloj:

trainingDateBegin {12/6/2012 12:00:00 PM}
trainingDateEnd {12/6/2012 1:00:00 PM}

Así que mi aplicación está pasando en la fecha del 12/6/2012 con un tiempo de 12:00:00 pm hasta el 12/6/2012 1:00:00 pm. Pero luego, cuando se genera el archivo vcs aquí está el resultado:

enter image description here

(Si la imagen no aparece, básicamente, Outlook tiene toda la información correcta: asunto, ubicación, fecha de inicio, fecha de finalización, PERO la hora es incorrecta. Dice de 11:12 a. m. a XNUMX:XNUMX p.

¿Alguien sabe lo que podría estar haciendo mal. Perdón por la larga publicación :(.

preguntado el 12 de junio de 12 a las 16:06

1 Respuestas

Creo que tiene que ver con las zonas horarias; puede agregar una zona horaria o (mucho más simple) usar la hora UTC en su archivo.

Si agrega una zona horaria, deberá usar vCal versión 2, ya que Outlook no admite zonas horarias en la versión 1.


EDITAR: Este es un ejemplo de la sintaxis tomada de el artículo de Wikipedia sobre VCalendar. Este evento ocurre desde el 14 de julio de 1997 a las 17:00 (UTC) hasta el 15 de julio de 1997 a las 03:59:59 (UTC):

BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//hacksw/handcal//NONSGML v1.0//EN
BEGIN:VEVENT
UID:uid1@example.com
DTSTAMP:19970714T170000Z
ORGANIZER;CN=John Doe:MAILTO:john.doe@example.com
DTSTART:19970714T170000Z
DTEND:19970715T035959Z
SUMMARY:Bastille Day Party
END:VEVENT
END:VCALENDAR

Respondido el 12 de junio de 12 a las 20:06

¿Cómo agregaría el UTC? Realmente no creo que ese sea el problema, pero podría ser... - oJM86o

Pruebe este formato para UTC: AAAAMMDDTHMMSSZ (la T y la Z son letras). He editado mi respuesta para incluir un ejemplo completo. - colin pickard

pero ¿dónde aplico ese formato dentro de C#? donde especifico string format; ??? - oJM86o

El formato es ISO 8601 por lo que puede utilizar writer.WriteLine("DTSTART:" + beginDate.ToUniversalTime().ToString("o")); - colin pickard

El uso de beginDate.ToUniversalTime() solucionó el problema que tuve con una situación similar. Gracias por la solución :D - Gayanee Wijayasekara

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.