2015-03-19 1 views
2

я нашел точную вещь, я пошел, чтобы знать, и это так просто (или должно быть):Как создать объект TimeZone для определенного часового пояса? C#

TimeZone.GetDaylightChanges() возвращает именно то, что мне нужно: Когда начинается время дневного света и заканчивается:

с этой целью я хотел бы сделать:

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

DaylightTime changes = zone.GetDaylightChanges(); 

Это, конечно, не будет компилировать, так как конструктор TimeZone не принимает TimeZoneInfo (WTF?), и я не могу понять как получить изменения DaylightTime любым другим способом. Мне нужно, чтобы кто-то установил «timeZoneName» в любой часовой пояс и смог получить начало/конец DateTimes за любой часовой пояс, на который он установил.

, имеющих ключевое значение: Сервер работает (скорее всего) UTC, а не часовой пояс, который находится в «TimeZoneName»

ответ

2

К сожалению, вы не можете создать экземпляр нового объекта TimeZone подобное. Тем не менее, я считаю, что вы можете получить информацию, которую вы хотите, из класса TimeZoneInfo, просмотрев AdjustmentRules.

Ниже приведены несколько методов, которые я написал, чтобы включить то, что вы хотите. См. Пример использования в нижней части, как он сравнивается с использованием метода 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 дней, поэтому я догадываюсь что неправильно. Однако базовый код выглядит как хороший старт. –

+0

Исправленный код: вернуть новый DaylightTime (daylightStart, daylightEnd, currentRules.DaylightDelta); –

+0

Ах, хороший улов. Я обновил образец кода. –