private static DateTime TransitionTimeToDateTime(Int32 year, TimeZoneInfo.TransitionTime transitionTime)
{
DateTime value;
DateTime timeOfDay = transitionTime.TimeOfDay;
if (transitionTime.IsFixedDateRule)
{
Int32 day = DateTime.DaysInMonth(year, transitionTime.Month);
value = new DateTime(year, transitionTime.Month, (day < transitionTime.Day) ? day : transitionTime.Day,
timeOfDay.Hour, timeOfDay.Minute, timeOfDay.Second, timeOfDay.Millisecond);
}
else
{
if (transitionTime.Week <= 4)
{
value = new DateTime(year, transitionTime.Month, 1, timeOfDay.Hour, timeOfDay.Minute, timeOfDay.Second, timeOfDay.Millisecond);
int dayOfWeek = (int)value.DayOfWeek;
int delta = (int)transitionTime.DayOfWeek - dayOfWeek;
if (delta < 0)
{
delta += 7;
}
delta += 7 * (transitionTime.Week - 1);
if (delta > 0)
{
value = value.AddDays(delta);
}
}
else
{
Int32 daysInMonth = DateTime.DaysInMonth(year, transitionTime.Month);
value = new DateTime(year, transitionTime.Month, daysInMonth, timeOfDay.Hour, timeOfDay.Minute, timeOfDay.Second, timeOfDay.Millisecond);
int dayOfWeek = (int) value.DayOfWeek;
int delta = dayOfWeek - (int)transitionTime.DayOfWeek;
if (delta < 0)
{
delta += 7;
}
if (delta > 0) {
value = value.AddDays(-delta);
}
}
}
return value;
}
}