2012-06-12 2 views
4

Я пытаюсь создать файл .vcs на C#. В основном в перспективе, если вы добавите назначение календаря создает файл, который в перспективе выглядит следующим образом:Создание файла VCS через C#, но либо outlook, либо C# не нравятся мои даты

enter image description here

Вы действительно можете экспортировать этот файл, кликните правой кнопкой мыши по нему и открыть его в вашем любимом текстовом редакторе. Это выглядит примерно так:

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 сверху. Вы можете видеть, что когда я открываю файл перспективы, он говорит 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 am, для beginDate и для endDate это, например, 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 страницу, где я могу заполнить значения перспективы ...

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 

Дата выдается прямо, как вы видите на экране, но время всегда неправильное ... Обычно внешний вид откроется с 10:00 до 11:00. Но мне не хватает времени, которое я ему даю. Например, в моей C# код здесь это экран часы:

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

Так мое приложение проходит в день 12/6/2012 со временем 12:00:00 до 12/6/2012 1:00:00. Но тогда, когда файл VCS генерируется вот результат:

enter image description here

(если изображение не показывает вверх в основном внешний вид оказывает всю корректную информацию: предмет, место, дата начала дата окончания, но время это говорит о том, что он работает с 11 утра до 12 вечера. Его почти так же, как его системные часы EST) ...

Кто-нибудь знает, что я могу делать неправильно. Извините за длинный пост :(

ответ

7

Я думаю, что это связано с часовых поясов,. Вы можете либо добавить часовой пояс или (гораздо проще) использовать время UTC в файле

Если вы добавляете часовой пояс вас. вам нужно будет использовать vCal версии 2, поскольку Outlook не поддерживает часовые пояса в версии 1.


EDIT: Это является примером синтаксиса, взятого из the Wikipedia article on VCalendar. Это событие произошло 14 июля 1997 года 17:00 (UTC) до 15 июля 1997 года 03:59:59 (UTC):

BEGIN:VCALENDAR 
VERSION:2.0 
PRODID:-//hacksw/handcal//NONSGML v1.0//EN 
BEGIN:VEVENT 
UID:[email protected] 
DTSTAMP:19970714T170000Z 
ORGANIZER;CN=John Doe:MAILTO:[email protected] 
DTSTART:19970714T170000Z 
DTEND:19970715T035959Z 
SUMMARY:Bastille Day Party 
END:VEVENT 
END:VCALENDAR 
+0

Как бы добавить UTC? Я действительно не думаю, что это проблема, но это может быть ... – oJM86o

+0

Попробуйте этот формат для UTC: YYYYMMDDTHHMMSSZ (буквы T и Z - буквы). Я отредактировал свой ответ, чтобы включить полный пример. –

+0

, но где я могу применить этот формат в C#? Где я указываю 'строковый формат;' ??? – oJM86o