2016-10-05 3 views
0

Я использую iCal для генерации прогноза. Приглашающие встречи приглашаются с портала. На портале у нас разные часовые пояса. Мы конвертируем все время в IST и выполняем операцию. и мой код выглядит следующим образом. Проблема, с которой я сталкиваюсь, заключается в том, что для пользователя paris создается повторяющийся запрос, половина приглашений показывает правильное время, но оставшиеся повторяющиеся приглашения, которые падают после DST (дневное свечение), показывают за 1 час до времени в календаре, в идеале они должны быть одинаковыми для них независимо от летнего времени. Как обращаться с DST, поскольку есть несколько часовых поясов, которые имеют для них отличный DST. Вы можете видеть в моем коде, у меня есть pass dtParentStime и dtParentEtime, время начала и окончания приглашения родителя в IST.Icalendar DST issue

str.AppendLine("BEGIN:VCALENDAR"); 
str.AppendLine("VERSION:2.0"); 
str.AppendLine("METHOD:REQUEST"); 
str.AppendLine("BEGIN:VTIMEZONE"); 
str.AppendLine("TZID:Asia/Kolkata"); 
str.AppendLine("BEGIN:STANDARD"); 
str.AppendLine("TZOFFSETFROM:+0530"); 
str.AppendLine("TZOFFSETTO:+0530");    
str.AppendLine("TZNAME:IST"); 
str.AppendLine("END:STANDARD"); 
str.AppendLine("END:VTIMEZONE"); 
str.AppendLine("BEGIN:VEVENT"); 
str.AppendLine(string.Format("DTSTART:{0:yyyyMMddTHHmmss}", dtParentStime)); //dtParentStime is the the parent request's start time in IST 
str.AppendLine(string.Format("DTSTAMP:{0:yyyyMMddTHHmmssZ}", DateTime.UtcNow)); 
str.AppendLine(string.Format("DTEND:{0:yyyyMMddTHHmmss}", dtParentEtime)); //dtParentEtime is the parent request's end time in IST 
str.AppendLine(string.Format("RRULE:FREQ=WEEKLY;UNTIL={0:yyyyMMddTHHmmssZ}", utcEtime)); 

str.AppendLine("LOCATION: ");    
str.AppendLine(string.Format("UID:{0}", meetingID)); 
str.AppendLine(string.Format("DESCRIPTION:{0}", msg.Body)); 
str.AppendLine(string.Format("X-ALT-DESC;FMTTYPE=text/html:{0}", msg.Body)); 
str.AppendLine(string.Format("SUMMARY:{0}", msg.Subject)); 
str.AppendLine(string.Format("ORGANIZER:MAILTO:{0}", msg.From.Address)); 
str.AppendLine("BEGIN:VALARM"); 
str.AppendLine("TRIGGER:-PT15M"); 
str.AppendLine("ACTION:DISPLAY"); 
str.AppendLine("DESCRIPTION:Reminder"); 
str.AppendLine("END:VALARM"); 
str.AppendLine("END:VEVENT"); 
str.AppendLine("END:VCALENDAR"); 
System.Net.Mime.ContentType ct = new System.Net.Mime.ContentType("text/calendar"); 
ct.Parameters.Add("method", "REQUEST"); 
AlternateView avCal = AlternateView.CreateAlternateViewFromString(str.ToString(), ct); 
msg.AlternateViews.Add(avCal);    
sc.Send(msg); 

Я также пробовал пропустить время UTC для начала и окончания времени и удалить разделы vtimezone в приведенном выше коде. но проблема усугубляется. поскольку приглашение 10AM предлагается в 8 утра, а после dst оно появляется в 7 утра для пользователей часовых поясов CET.

Примечание: - если я использую время UTC для даты начала и окончания с разделом vtimezone, удаленным для единственного приглашения (приглашение без повторения), тогда время календаря будет правильным до DST и после DST. Есть что-то, чего мне не хватает, чтобы добавить в RRULE?

ответ

0

Я предлагаю вам преобразовать каждую дату в формате UTC и форматировать все с «Z» в конце строки формата

str.AppendLine(string.Format("DTSTART:{0:yyyyMMddTHHmmssZ}", dtParentStime.ToUniversalTime())); 
str.AppendLine(string.Format("DTEND:{0:yyyyMMddTHHmmssZ}", dtParentEtime.ToUniversalTime())); 

или

str.AppendLine(string.Format("DTSTART:{0:yyyyMMddTHHmmssZ}", dtParentStime.UtcDateTime)); 
str.AppendLine(string.Format("DTEND:{0:yyyyMMddTHHmmssZ}", dtParentEtime.UtcDateTime)); 

и удалить эти строки

str.AppendLine("BEGIN:VTIMEZONE"); 
str.AppendLine("TZID:Asia/Kolkata"); 
str.AppendLine("BEGIN:STANDARD"); 
str.AppendLine("TZOFFSETFROM:+0530"); 
str.AppendLine("TZOFFSETTO:+0530");    
str.AppendLine("TZNAME:IST"); 
str.AppendLine("END:STANDARD"); 
str.AppendLine("END:VTIMEZONE"); 

Я надеюсь, что это поможет

+0

Привет выше решение не работал, я применил ВВ и удаленное vtimezone линию. но это заставило приглашение появиться за 2 часа до того, как приглашение 10AM появлялось в 8 утра, а после DST оно появлялось в 7 утра для часовой пояс CET. – Chandikumar

+0

Для единственного приглашения (не повторяющегося) ваше предложение работает нормально. но для повторяющейся проблемы встречи это же, их проблема с RRULE? – Chandikumar

0

Простого определения VTIMEZONE недостаточно. Вы должны указать TZID в самих свойствах DTSTART и DTEND:

str.AppendLine(string.Format("DTSTART;TZID=Asia/Kolkata:{0:yyyyMMddTHHmmss}", dtParentStime)); 
str.AppendLine(string.Format("DTEND;TZID=Asia/Kolkata:{0:yyyyMMddTHHmmss}", dtParentEtime)); 

Затем, если вы хотите, чтобы событие, чтобы остаться в то же время дня для пользователей CET, вы должны использовать часовой пояс CET вместо Азия/Калькутта один. Об этом нет.

Так что вам нужно, чтобы заменить компонент VTIMEZONE что-то вроде:

BEGIN:VTIMEZONE 
TZID:Europe/Paris 
BEGIN:DAYLIGHT 
TZOFFSETFROM:+0100 
TZOFFSETTO:+0200 
DTSTART:19810329T020000 
RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU 
TZNAME:CEST 
END:DAYLIGHT 
BEGIN:STANDARD 
TZOFFSETFROM:+0200 
TZOFFSETTO:+0100 
DTSTART:19961027T030000 
RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU 
TZNAME:CET 
END:STANDARD 
END:VTIMEZONE 

и ссылки на Europe/Paris TZID в вашем DTSTART/DTEND. Конечно, DTSTART/DTEND должен иметь значение, соответствующее времени CET день:

str.AppendLine(string.Format("DTSTART;TZID=Europe/Paris:{0:yyyyMMddTHHmmss}", dtParentStime)); 
str.AppendLine(string.Format("DTEND;TZID=Europe/Paris:{0:yyyyMMddTHHmmss}", dtParentEtime)); 
+0

Привет, он работает с TZID и без него. половина приглашений показывает правильное время, но оставляют повторяющиеся приглашения, которые падают после DST (дневная световая индикация), показывают за 1 час до времени для пользователей CET. В соответствии с потребностью время для пользователей IST должно измениться не для пользователей часовых поясов CET. но происходит реверс 1030AM CET календарь появляется на 2 вечера в IST для всех повторений, но пост DST для CET это 930AM. – Chandikumar

+0

Не заметил, что вы хотели, чтобы события всегда были в CET. Соответственно отредактировал мой ответ. – arnaudq

+0

Привет, на портале у нас есть список часовых поясов и пользователей, которые выбирают часовой пояс в зависимости от страны. вы хотите добавить TZID для каждого выбранного часового пояса? – Chandikumar