Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# VCALENDAR.ics文件问题_C# - Fatal编程技术网

C# VCALENDAR.ics文件问题

C# VCALENDAR.ics文件问题,c#,C#,我有一个.ics文件,当最终用户注册课程时,它会将日历设置为OutLook 2010。我的服务器位于东海岸(orhas EST zone)。但是,我的应用程序所针对的两个地区都位于中央标准时区(CST)和山区标准时区(MST)。我的问题是,如果课程开始时间是CST,并且用户是从MST区域注册的,则在Outlook中设置日历条目时,日历条目比实际开始时间提前2小时设置。例如,课程在上午10:30开始,我注册了课程,我在MST区。我的Outlook日历条目将课程设置为上午8:30开始,而不是上午9:

我有一个.ics文件,当最终用户注册课程时,它会将日历设置为OutLook 2010。我的服务器位于东海岸(orhas EST zone)。但是,我的应用程序所针对的两个地区都位于中央标准时区(CST)和山区标准时区(MST)。我的问题是,如果课程开始时间是CST,并且用户是从MST区域注册的,则在Outlook中设置日历条目时,日历条目比实际开始时间提前2小时设置。例如,课程在上午10:30开始,我注册了课程,我在MST区。我的Outlook日历条目将课程设置为上午8:30开始,而不是上午9:30开始。 此外,如果课程是MST区域,而我也是MST区域,则课程设置为比课程开始时间晚一小时。例如,课程将在下午2:00开始MST我注册了课程,我也在MST中Outlook日历条目将该条目设置为下午3:00,此时应为下午2:00 我的代码如下:`

//create the Body in VCALENDAR format
string calDateFormat = "yyyyMMddTHHmmssZ";
string bodyCalendar = "BEGIN:VCALENDAR\r\nMETHOD:REQUEST\r\nPRODID:Microsoft CDO for Microsoft Exchange\r\nVERSION:2.0\r\nBEGIN:VTIMEZONE\r\nX-MICROSOFT-CDO-TZID:11\r\nBEGIN:STANDARD\r\nDTSTART:16010101T020000\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0600\r\nRRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nDTSTART:16010101T020000\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0500\r\nRRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nEND:VTIMEZONE\r\nBEGIN:VEVENT\r\nDTSTAMP:{8}\r\nDTSTART:{0}\r\nSUMMARY:{7}\r\nUID:{5}\r\nATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CN=\"{9}\":MAILTO:{9}\r\nACTION;RSVP=TRUE;CN=\"{4}\":MAILTO:{4}\r\nORGANIZER;CN=\"{3}\":mailto:{4}\r\nLOCATION:{2}\r\nDTEND:{1}\r\nDESCRIPTION:{7}\\N\r\nSEQUENCE:1\r\nPRIORITY:5\r\nCLASS:\r\nCREATED:{8}\r\nLAST-MODIFIED:{8}\r\nSTATUS:CONFIRMED\r\nTRANSP:OPAQUE\r\nX-MICROSOFT-CDO-BUSYSTATUS:BUSY\r\nX-MICROSOFT-CDO-INSTTYPE:0\r\nX-MICROSOFT-CDO-INTENDEDSTATUS:BUSY\r\nX-MICROSOFT-CDO-ALLDAYEVENT:FALSE\r\nX-MICROSOFT-CDO-IMPORTANCE:1\r\nX-MICROSOFT-CDO-OWNERAPPTID:-1\r\nX-MICROSOFT-CDO-ATTENDEE-CRITICAL-CHANGE:{8}\r\nX-MICROSOFT-CDO-OWNER-CRITICAL-CHANGE:{8}\r\nBEGIN:VALARM\r\nACTION:DISPLAY\r\nDESCRIPTION:REMINDER\r\nTRIGGER;RELATED=START:-PT00H15M00S\r\nEND:VALARM\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n";
bodyCalendar = string.Format(bodyCalendar,
            start.ToUniversalTime().ToString(calDateFormat),
            end.ToUniversalTime().ToString(calDateFormat),
            location,
            organizerName,
            organizerEmail,
            Guid.NewGuid().ToString("B"),
            summary,
            subject,
            DateTime.Now.ToUniversalTime().ToString(calDateFormat),
            attendeeList.ToString());

AlternateView calendarView = AlternateView.CreateAlternateViewFromString(bodyCalendar, calendarType);
calendarView.TransferEncoding = TransferEncoding.SevenBit;
msg.AlternateViews.Add(calendarView);
这是我用来抵消东部时区的代码:

if ((state == "CO" || state == "WY" || state == "MT") && classTimeZone == "MST")
{
    StartDate = StartDate + TimeSpan.Parse("2:00");
    EndDate = EndDate + TimeSpan.Parse("2:00");
}
else if ((state == "CO" || state == "WY" || state == "MT") && classTimeZone == "CST")
{
    StartDate = StartDate + TimeSpan.Parse("1:00");
    EndDate = EndDate + TimeSpan.Parse("1:00");
}
else if ((state == "ND" || state == "SD" || state == "KS" || state == "NE" || state == "MO" || state == "IA") && classTimeZone == "MST")
{
    StartDate = StartDate + TimeSpan.Parse("2:00");
    EndDate = EndDate + TimeSpan.Parse("2:00");
}
else if ((state == "ND" || state == "SD" || state == "KS" || state == "NE" || state == "MO" || state == "IA") && classTimeZone == "CST")
{
    StartDate = StartDate + TimeSpan.Parse("1:00");
    EndDate = EndDate + TimeSpan.Parse("1:00");
}

圣墙文字,蝙蝠侠。请查看您的帖子,并对其进行格式化,以便阅读时不会感到痛苦,或者人们可能会真正阅读它。您是否考虑过使用
DateTimeOffset
而不是
DateTime
?它内置了时区偏移信息,因此您不必执行太多手动(硬编码!)时区转换。SQL Server(如果那是您的DBMS)也有相应的
datetimeoffset
数据类型用于数据存储。我尝试了上述建议,将DateTime更改为datetimeoffset,并且没有更改日历插入。它仍然会在时区的实际开始时间前两小时插入时间。