К сожалению, вы не можете создать экземпляр нового объекта 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);
}
Поставляется с временной сдвигом 238 дней, поэтому я догадываюсь что неправильно. Однако базовый код выглядит как хороший старт. –
Исправленный код: вернуть новый DaylightTime (daylightStart, daylightEnd, currentRules.DaylightDelta); –
Ах, хороший улов. Я обновил образец кода. –