4

我正在尝试在 C# 中创建一个 .vcs 文件。基本上在 Outlook 中,如果您添加日历约会,它会在 Outlook 中创建一个文件,如下所示:

在此处输入图像描述

您实际上可以导出此文件,右键单击它并在您喜欢的文本编辑器中打开它。它看起来像这样:

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

所以我遇到的问题是上面的 DTSTART 和 DTEND 的实际时间。您可以看到,当我打开 Outlook 文件时,它显示为上午 11:00(如屏幕截图所示),但在文本文件中我将其显示为下午 12:00。

所以我有一个应用程序(培训应用程序),我可以在其中动态创建这些 vcs 文件之一。使用 C# 我收集主题、位置、描述和日期(带时间),如下所示:

 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");
        }

因此,在上面的代码中,fromTime 变成了例如上午 7:00,而 toTime 变成了上午 8:00。然后我使用 DateTime.TryParseExact 将日期与时间合并,这样它就变成了06/01/2012 7:00 amforbeginDate和 forendDate它变成了 for 06/01/2012 8:00 am

到目前为止一切顺利......然后我只是调用一个函数 OpenVCSFile ,它只是一些 javascript 来打开传入的 url,如下所示:

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>");
        }

然后这会调用vcsFile.aspx我可以填写 Outlook 值的页面...

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();
        }

除了最重要的部分,我执行此操作的部分之外,一切似乎都有效:

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

正如您在 Outlook 屏幕截图中看到的那样,日期是正确的,但时间总是错误的......通常 Outlook 会在上午 10:00 到上午 11:00 之间打开它。但它从来不需要我给它的时间。例如,在我的 c# 代码中,这里是监视屏幕:

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

所以我的应用程序在 2012 年 12 月 6 日的日期通过,时间为 12:00:00 pm 到 12/6/2012 1:00:00 pm。但是当这里生成 vcs 文件时,结果是:

在此处输入图像描述

(如果图像没有显示基本上 Outlook 有所有正确的信息:主题,位置,开始日期结束日期但时间错误。它说上午 11 点到下午 12 点。它几乎就像它使用我的系统时钟 EST)...

有谁知道我可能做错了什么。对不起,很长的帖子:(。

4

1 回答 1

7

我认为这与时区有关;您可以添加时区或(更简单)在文件中使用 UTC 时间。

如果确实添加了时区,则需要使用 vCal 版本 2,因为 Outlook 不支持版本 1 中的时区。


编辑:这是取自维基百科文章 VCalendar的语法示例。此事件发生在 1997 年 7 月 14 日 17:00 (UTC) 到 1997 年 7 月 15 日 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
于 2012-06-12T15:38:00.730 回答