2012-04-25 4 views
0

Добрый день!Как создать запрос на собрание с использованием класса C# TimeZoneInfo с компонентом часового пояса 4.6.5 VTIMEZONE

Я пытаюсь обновить какой-то ранее существовавший код, который использует компонент VTIMEZONE 4.6.5 Time Zone, чтобы создать запрос на собрание на основе ввода от пользователя в форме на веб-сайте 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"; 

Конечная цель состоит в том, чтобы иметь время начала запроса на встречу, установленного для выбранного часового пояса. т. е. я выбираю 2-часовую встречу в (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(); 
    } 

ответ

0

Для получения текущей информации String.Format и полей TimeZoneInfo как BaseUtcOffset должны помочь с некоторыми свойствами

vTimeZoneTemplate = String.Format(
    "BEGIN:VTIMEZONE\n...{0}{1}...", 
     tz.BaseUtcOffset.Hours, tz.BaseUtcOffset.Minutes); 

Но я не уверен, что вы можете собрать достаточную информацию с помощью TimeZoneInfo для построения полной структуры VTIMEZONE.

+0

Почему вы так говорите? – Mith

+0

Потому что я не знаю, можете ли вы - никогда не делал это сам/выглядел достаточно глубоко. –

0

Это:

//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); 
     } 
    } 

работал для меня. Поэтому я надеюсь, что это поможет кому-то еще. :)