Hello_. 너무 늦었을 수도 있지만이 목적을 위해 사용한 코드는 여기에 게시 할 것입니다. 이것은 아마도 누군가 그것을 구현할 때 안전 할 수 있습니다. 나는 링크의 도움으로 실제로 그것을했습니다 @ Jamiegs 대답입니다.
public static DateTime? GetNextTransition(DateTime asOfTime, TimeZoneInfo timeZone)
{
TimeZoneInfo.AdjustmentRule[] adjustments = timeZone.GetAdjustmentRules();
if (adjustments.Length == 0)
{
// if no adjustment then no transition date exists
return null;
}
int year = asOfTime.Year;
TimeZoneInfo.AdjustmentRule adjustment = null;
foreach (TimeZoneInfo.AdjustmentRule adj in adjustments)
{
// Determine if this adjustment rule covers year desired
if (adj.DateStart.Year <= year && adj.DateEnd.Year >= year)
{
adjustment = adj;
break;
}
}
if (adjustment == null)
{
// no adjustment found so no transition date exists in the range
return null;
}
DateTime dtAdjustmentStart = GetAdjustmentDate(adjustment.DaylightTransitionStart, year);
DateTime dtAdjustmentEnd = GetAdjustmentDate(adjustment.DaylightTransitionEnd, year);
if (dtAdjustmentStart >= asOfTime)
{
// if adjusment start date is greater than asOfTime date then this should be the next transition date
return dtAdjustmentStart;
}
else if (dtAdjustmentEnd >= asOfTime)
{
// otherwise adjustment end date should be the next transition date
return dtAdjustmentEnd;
}
else
{
// then it should be the next year's DaylightTransitionStart
year++;
foreach (TimeZoneInfo.AdjustmentRule adj in adjustments)
{
// Determine if this adjustment rule covers year desired
if (adj.DateStart.Year <= year && adj.DateEnd.Year >= year)
{
adjustment = adj;
break;
}
}
dtAdjustmentStart = GetAdjustmentDate(adjustment.DaylightTransitionStart, year);
return dtAdjustmentStart;
}
}
public static DateTime GetAdjustmentDate(TimeZoneInfo.TransitionTime transitionTime, int year)
{
if (transitionTime.IsFixedDateRule)
{
return new DateTime(year, transitionTime.Month, transitionTime.Day);
}
else
{
// For non-fixed date rules, get local calendar
Calendar cal = CultureInfo.CurrentCulture.Calendar;
// Get first day of week for transition
// For example, the 3rd week starts no earlier than the 15th of the month
int startOfWeek = transitionTime.Week * 7 - 6;
// What day of the week does the month start on?
int firstDayOfWeek = (int)cal.GetDayOfWeek(new DateTime(year, transitionTime.Month, 1));
// Determine how much start date has to be adjusted
int transitionDay;
int changeDayOfWeek = (int)transitionTime.DayOfWeek;
if (firstDayOfWeek <= changeDayOfWeek)
transitionDay = startOfWeek + (changeDayOfWeek - firstDayOfWeek);
else
transitionDay = startOfWeek + (7 - firstDayOfWeek + changeDayOfWeek);
// Adjust for months with no fifth week
if (transitionDay > cal.GetDaysInMonth(year, transitionTime.Month))
transitionDay -= 7;
return new DateTime(year, transitionTime.Month, transitionDay, transitionTime.TimeOfDay.Hour, transitionTime.TimeOfDay.Minute, transitionTime.TimeOfDay.Second);
}
}
샘플 사용은 다음과 같이 표시됩니다
// This should give you DateTime object for date 26 March 2017
// because this date is first transition date after 1 January 2017 for Central Europe Standard Time zone
DateTime nextTransitionDate = GetNextTransition(new DateTime(2017, 1, 1), TimeZoneInfo.FindSystemTimeZoneById("Central Europe Standard Time"))
당신은 내가 here 함께 연주 코드를 찾을 수 있습니다.
DST는 동물입니다 ... 대부분의 애리조나 (인디언 보호 구역 DST)는 DST를 존중하지 않습니다. 우리의 시간대는 MST로 유지되므로 우리는 시간을 조정하지 않습니다 ... 반면 Denver는 MDT로 전환하고 시간을 조정한다고 말합니다. –
Noda Time을 사용하여 전환 시간을 얻는 방법은 [this thread] (http://stackoverflow.com/questions/24373618/getting-daylight-savings-time-start-and-end-in-nodatime)를 참조하십시오. – Azimuth