0

良い一日!

4.6.5 タイム ゾーン コンポーネント VTIMEZONE を使用して、asp.net Web サイトのフォームでユーザーからの入力に基づいて会議出席依頼を作成する既存のコードを更新しようとしています。私が行っている更新は、列挙型としてリストされていたタイムゾーンの静的リストを削除し、それらを 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) イスタンブールで午後 4 時に開始する 2 時間の会議を選択すると、現在のトルコ標準時間であるイスタンブール時間で午後 4 時から午後 6 時までの会議出席依頼が作成されます。

それが役立つ場合、私は 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();
    }
4

2 に答える 2

1

これ:

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

私のために働いた。だから、それが他の誰かにも役立つことを願っています。:)

于 2012-05-14T15:38:00.083 に答える
0

現在の情報 String.Format と BaseUtcOffset のような TimeZoneInfo のフィールドについてはいくつかのプロパティで役立つはずです

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

しかし、完全な VTIMEZONE 構造を構築するために TimeZoneInfo で十分な情報を収集できるかどうかはわかりません。

于 2012-04-25T16:24:30.560 に答える