2015-03-19 58 views
2

我發現我去知道確切的事情,它是如此簡單(或者說應該是):如何爲特定時區創建TimeZone對象? C#

TimeZone.GetDaylightChanges()返回正是我所需要的:當夏令時開始和結束:

爲此,我願意這樣做:

TimeZoneInfo currentTimezone = TimeZoneInfo.FindSystemTimeZoneById(timeZoneName); 
TimeZone zone = new TimeZone (currentTimezone); // Compile error here. 

DaylightTime changes = zone.GetDaylightChanges(); 

這當然不能編譯,因爲時區的構造並不需要的TimeZoneInfo(WTF?),我想不通的如何通過其他方式獲取DaylightTime更改。我需要某人將'timeZoneName'設置爲任何時區,並且能夠爲其設置的任何時區獲取開始/結束日期時間。

關鍵重要的:服務器運行的是(最有可能)UTC,而不是時區是在「TIMEZONENAME」

回答

2

不幸的是,你不能像實例化一個新的TimeZone對象。不過,我相信你可以通過查看AdjustmentRules來獲得你想要的TimeZoneInfo類的信息。

下面是我寫的一些方法來啓用你想要的。請參閱底部的示例用法,瞭解它如何與當前系統時區使用TimeZone方法進行比較。

UPDATE

我已經修改了代碼轉換成幾個類助陣的日期數學,並從樣品這裏大量舉債:https://msdn.microsoft.com/en-us/library/system.timezoneinfo.transitiontime.isfixeddaterule.aspx

public static DaylightTime GetDaylightChanges(string timeZoneName, int year) 
{ 
    TimeZoneInfo currentTimezone = TimeZoneInfo.FindSystemTimeZoneById(timeZoneName); 

    var currentRules = 
     currentTimezone.GetAdjustmentRules().FirstOrDefault(rule => 
      rule.DateStart <= DateTime.Today && 
      rule.DateEnd >= DateTime.Today); 

    if (currentRules != null) 
    { 
     var daylightStart = 
      GetTransitionDate(currentRules.DaylightTransitionStart, year); 

     var daylightEnd = 
      GetTransitionDate(currentRules.DaylightTransitionEnd, year); 

     return new DaylightTime(daylightStart, daylightEnd, 
      currentRules.DaylightDelta); 
    } 

    return null; 
} 

private static DateTime GetTransitionDate(TimeZoneInfo.TransitionTime transition, 
    int year) 
{ 
    return (transition.IsFixedDateRule) 
     ? new DateTime(year, transition.Month, transition.Day, 
      transition.TimeOfDay.Hour, transition.TimeOfDay.Minute, 
      transition.TimeOfDay.Second) 
     : GetNonFixedTransitionDate(transition, year); 
} 

private static DateTime GetNonFixedTransitionDate(
    TimeZoneInfo.TransitionTime transition, int year) 
{ 
    var calendar = CultureInfo.CurrentCulture.Calendar; 
    int startOfWeek = transition.Week * 7 - 6; 
    int firstDayOfWeek = (int) calendar.GetDayOfWeek(new DateTime(year, 
     transition.Month, 1)); 

    int changeDayOfWeek = (int) transition.DayOfWeek; 

    int transitionDay = (firstDayOfWeek <= changeDayOfWeek) 
     ? startOfWeek + (changeDayOfWeek - firstDayOfWeek) 
     : startOfWeek + (7 - firstDayOfWeek + changeDayOfWeek); 

    if (transitionDay > calendar.GetDaysInMonth(year, transition.Month)) 
     transitionDay -= 7; 

    return new DateTime(year, transition.Month, transitionDay, 
     transition.TimeOfDay.Hour, transition.TimeOfDay.Minute, 
     transition.TimeOfDay.Second); 
} 

下面是和示例如何使用它,與使用當前TimeZone方法相比:

public static void Main() 
{ 
    var daylightTime = GetDaylightChanges("Pacific Standard Time", DateTime.Today.Year); 
    var dylightTime2 = TimeZone.CurrentTimeZone.GetDaylightChanges(DateTime.Today.Year); 
} 
+0

出現238 DAYS的時間轉移,所以我猜guessi那是不正確的。但是,基本代碼看起來是一個好的開始。 – 2015-03-19 16:11:03

+0

更正的代碼是:返回新的DaylightTime(daylightStart,daylightEnd,currentRules.DaylightDelta); – 2015-03-19 16:14:58

+0

啊,很好。我更新了代碼示例。 – 2015-03-19 17:48:39