Я пытаюсь создать файл .vcs на C#. В основном в перспективе, если вы добавите назначение календаря создает файл, который в перспективе выглядит следующим образом:Создание файла VCS через C#, но либо outlook, либо C# не нравятся мои даты
Вы действительно можете экспортировать этот файл, кликните правой кнопкой мыши по нему и открыть его в вашем любимом текстовом редакторе. Это выглядит примерно так:
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 генерируется вот результат:
(если изображение не показывает вверх в основном внешний вид оказывает всю корректную информацию: предмет, место, дата начала дата окончания, но время это говорит о том, что он работает с 11 утра до 12 вечера. Его почти так же, как его системные часы EST) ...
Кто-нибудь знает, что я могу делать неправильно. Извините за длинный пост :(
Как бы добавить UTC? Я действительно не думаю, что это проблема, но это может быть ... – oJM86o
Попробуйте этот формат для UTC: YYYYMMDDTHHMMSSZ (буквы T и Z - буквы). Я отредактировал свой ответ, чтобы включить полный пример. –
, но где я могу применить этот формат в C#? Где я указываю 'строковый формат;' ??? – oJM86o