Как создать приглашение на собрание, используя класс C# TimeZoneInfo с 4.6.5 компонентом часового пояса VTIMEZONE
Хорошего дня!
Я пытаюсь обновить уже существующий код, который использует компонент 4.6.5 часового пояса VTIMEZONE, чтобы создать приглашение на собрание, основанное на вводе данных пользователем в форме на веб-сайте asp.net. Обновление, которое я делаю, удаляет статический список часовых поясов, которые были перечислены как перечисление, и заменяет их методом TimeZoneInfo GetSystemTimeZones. Проблема в том, что способ настройки VTIMEZONE имеет статические значения. Мне интересно, как лучше подойти к этому, и буду рад любым предложениям.
Вот фрагмент кода:
private const string vTimeZoneTemplate = @"
BEGIN:VTIMEZONE
TZID:Pacific
BEGIN:STANDARD
DTSTART:20071104T020000
RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11
TZOFFSETFROM:-0700
TZOFFSETTO:-0800
TZNAME:PST
END:STANDARD
BEGIN:DAYLIGHT
DTSTART:20070311T020000
RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3
TZOFFSETFROM:-0800
TZOFFSETTO:-0700
TZNAME:PDT
END:DAYLIGHT
END:VTIMEZONE
BEGIN:VTIMEZONE
TZID:Eastern
BEGIN:STANDARD
DTSTART:20071104T020000
RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11
TZOFFSETFROM:-0400
TZOFFSETTO:-0500
TZNAME:EST
END:STANDARD
BEGIN:DAYLIGHT
DTSTART:20070311T020000
RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3
TZOFFSETFROM:-0500
TZOFFSETTO:-0400
TZNAME:EDT
END:DAYLIGHT
END:VTIMEZONE";
Конечная цель - установить время начала для приглашения на собрание для выбранного часового пояса. то есть я выбираю двухчасовую встречу в (UTC+02:00) в Стамбуле, начиная с 16:00, она создаст приглашение на собрание с 16:00 до 18:00 по стамбульскому времени, которое в настоящее время является стандартным для Турции.
если это помогает, я использую TimeZoneInfo как таковой:
if (!IsPostBack)
{
System.Collections.ObjectModel.ReadOnlyCollection<TimeZoneInfo> TimeZoneList = TimeZoneInfo.GetSystemTimeZones();
this.ddlTimezones.DataSource = TimeZoneList;
this.ddlTimezones.DataTextField = "DisplayName";
this.ddlTimezones.DataValueField = "Id";
this.ddlTimezones.DataBind();
}
2 ответа
Это:
//This string is used for timezones that observe DST
//RRULE:FREQ=YEARLY;BYDAY=[Week of Month][Day];BYMONTH=[Month]
private const string vTimeZoneTemplate1 = @"
BEGIN:VTIMEZONE
TZID:{0}
BEGIN:DAYLIGHT
DTSTART:{1}
RRULE:FREQ=YEARLY;BYDAY={9}{11};BYMONTH={7}
TZOFFSETFROM:{2}
TZOFFSETTO:{3}
TZNAME:{4}
END:DAYLIGHT
BEGIN:STANDARD
DTSTART:{6}
RRULE:FREQ=YEARLY;BYDAY={10}{12};BYMONTH={8}
TZOFFSETFROM:{3}
TZOFFSETTO:{2}
TZNAME:{5}
END:STANDARD
END:VTIMEZONE";
//This string is used for timezones that do not observe DST; however, DAYLIGHT and STANDARD are required.
//Therefore used static dates and made no change to the UTCOffset
private const string vTimeZoneTemplate2 = @"
BEGIN:VTIMEZONE
TZID:{0}
BEGIN:DAYLIGHT
DTSTART:20070311T020000
RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3
TZOFFSETFROM:{1}
TZOFFSETTO:{1}
TZNAME:{2}
END:DAYLIGHT
BEGIN:STANDARD
DTSTART:20071104T020000
RRULE:RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11
TZOFFSETFROM:{1}
TZOFFSETTO:{1}
TZNAME:{2}
END:STANDARD
END:VTIMEZONE";
и это:
/**
* get the adjustment rules for the selected timezone.
* the adjustment rule is the Daylight Savings adjustment by default.
* using the i to note the most recent rule.
* DateStart and .DateEnd designate the begin and end of the rule.
* DaylightTransitionStart and End designate the begin and end date of DST.
* DayLightDelta is the difference between base UTC and the offset by DS, add to get DS value from Base.
**/
if (timezone.SupportsDaylightSavingTime)
{
TimeZoneInfo.AdjustmentRule[] adjustments = timezone.GetAdjustmentRules();
int i = adjustments.Length - 1;
string body = string.Format(vTimeZoneTemplate1
, timezone.Id
, adjustments[i].DateStart.ToString(DateTimeFormat)
, timezone.BaseUtcOffset
, adjustments[i].DaylightDelta.Add(timezone.BaseUtcOffset)
, timezone.DaylightName
, timezone.StandardName
, adjustments[i].DateEnd.ToString(DateTimeFormat)
, adjustments[i].DaylightTransitionStart.Month.ToString("MM")
, adjustments[i].DaylightTransitionEnd.Month.ToString("MM")
, adjustments[i].DaylightTransitionStart.Week.ToString()
, adjustments[i].DaylightTransitionEnd.Week.ToString()
, adjustments[i].DaylightTransitionStart.IsFixedDateRule
? adjustments[i].DaylightTransitionStart.Day.ToString().Substring(0, 2)
: adjustments[i].DaylightTransitionStart.DayOfWeek.ToString().Substring(0, 2)
, adjustments[i].DaylightTransitionEnd.IsFixedDateRule
? adjustments[i].DaylightTransitionEnd.Day.ToString().Substring(0, 2)
: adjustments[i].DaylightTransitionEnd.DayOfWeek.ToString().Substring(0, 2)) +
string.Format(vEventTemplate
, timezone.Id
, startDate
, endDate
, summary
, description
, Guid.NewGuid().ToString()
, sequence
, DateTime.Now.ToString(DateTimeFormat)
, vCalAttendees.ToString()
, organizer.FullName
, organizer.Email
, location
, string.IsNullOrEmpty(this.DescriptionHtml) ? string.Empty : string.Format("X-ALT-DESC;FMTTYPE=text/html:{0}", Email.WrapHTMLBody(this.DescriptionHtml, false, false))) +
(enableReminder ? vAlarmTemplate : string.Empty);
return string.Format(baseVCalTemplate, body);
}
else
{
string body = string.Format(vTimeZoneTemplate2
, timezone.Id
, timezone.BaseUtcOffset
, timezone.DisplayName) +
string.Format(vEventTemplate
, timezone.Id
, startDate
, endDate
, summary
, description
, Guid.NewGuid().ToString()
, sequence
, DateTime.Now.ToString(DateTimeFormat)
, vCalAttendees.ToString()
, organizer.FullName
, organizer.Email
, location
, string.IsNullOrEmpty(this.DescriptionHtml) ? string.Empty : string.Format("X-ALT-DESC;FMTTYPE=text/html:{0}", Email.WrapHTMLBody(this.DescriptionHtml, false, false))) +
(enableReminder ? vAlarmTemplate : string.Empty);
return string.Format(baseVCalTemplate, body);
}
}
работал на меня. Итак, я надеюсь, что это поможет кому-то еще там.:)
Для текущей информации String.Format и поля TimeZoneInfo, такие как BaseUtcOffset, должны помочь с некоторыми свойствами
vTimeZoneTemplate = String.Format(
"BEGIN:VTIMEZONE\n...{0}{1}...",
tz.BaseUtcOffset.Hours, tz.BaseUtcOffset.Minutes);
Но я не уверен, что вы сможете собрать достаточно информации с TimeZoneInfo, чтобы построить полную структуру VTIMEZONE.