TimeZoneInfo.TransitionTime.IsFixedDateRule 属性
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
获取一个值,该值指示是在固定日期和时间(如 11 月 1 日)还是在浮动日期和时间(如 10 月的最后一个星期日)发生时间更改。
public:
property bool IsFixedDateRule { bool get(); };
public bool IsFixedDateRule { get; }
member this.IsFixedDateRule : bool
Public ReadOnly Property IsFixedDateRule As Boolean
属性值
如果时间更改规则为固定日期,则为 true
;如果时间更改规则为浮动日期,则为 false
。
示例
以下示例列出了本地系统上可用的所有时区的夏令时到夏令时之间的转换时间。 对于具有固定日期规则的时区,它显示对象属性 TimeZoneInfo.TransitionTime 中的过渡时间信息。 对于没有固定日期规则的时区,它使用 Calendar 表示当前系统日历的对象来确定转换的实际开始日期和结束日期。 该示例向控制台显示结果。
private void GetTransitionTimes(int year)
{
// Instantiate DateTimeFormatInfo object for month names
DateTimeFormatInfo dateFormat = CultureInfo.CurrentCulture.DateTimeFormat;
// Get and iterate time zones on local computer
ReadOnlyCollection<TimeZoneInfo> timeZones = TimeZoneInfo.GetSystemTimeZones();
foreach (TimeZoneInfo timeZone in timeZones)
{
Console.WriteLine("{0}:", timeZone.StandardName);
TimeZoneInfo.AdjustmentRule[] adjustments = timeZone.GetAdjustmentRules();
int startYear = year;
int endYear = startYear;
if (adjustments.Length == 0)
{
Console.WriteLine(" No adjustment rules.");
}
else
{
TimeZoneInfo.AdjustmentRule adjustment = GetAdjustment(adjustments, year);
if (adjustment == null)
{
Console.WriteLine(" No adjustment rules available for this year.");
continue;
}
TimeZoneInfo.TransitionTime startTransition, endTransition;
// Determine if starting transition is fixed
startTransition = adjustment.DaylightTransitionStart;
// Determine if starting transition is fixed and display transition info for year
if (startTransition.IsFixedDateRule)
Console.WriteLine(" Begins on {0} {1} at {2:t}",
dateFormat.GetMonthName(startTransition.Month),
startTransition.Day,
startTransition.TimeOfDay);
else
DisplayTransitionInfo(startTransition, startYear, "Begins on");
// Determine if ending transition is fixed and display transition info for year
endTransition = adjustment.DaylightTransitionEnd;
// Does the transition back occur in an earlier month (i.e.,
// the following year) than the transition to DST? If so, make
// sure we have the right adjustment rule.
if (endTransition.Month < startTransition.Month)
{
endTransition = GetAdjustment(adjustments, year + 1).DaylightTransitionEnd;
endYear++;
}
if (endTransition.IsFixedDateRule)
Console.WriteLine(" Ends on {0} {1} at {2:t}",
dateFormat.GetMonthName(endTransition.Month),
endTransition.Day,
endTransition.TimeOfDay);
else
DisplayTransitionInfo(endTransition, endYear, "Ends on");
}
}
}
private static TimeZoneInfo.AdjustmentRule GetAdjustment(TimeZoneInfo.AdjustmentRule[] adjustments,
int year)
{
// Iterate adjustment rules for time zone
foreach (TimeZoneInfo.AdjustmentRule adjustment in adjustments)
{
// Determine if this adjustment rule covers year desired
if (adjustment.DateStart.Year <= year && adjustment.DateEnd.Year >= year)
return adjustment;
}
return null;
}
private void DisplayTransitionInfo(TimeZoneInfo.TransitionTime transition, int year, string label)
{
// 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 = transition.Week * 7 - 6;
// What day of the week does the month start on?
int firstDayOfWeek = (int) cal.GetDayOfWeek(new DateTime(year, transition.Month, 1));
// Determine how much start date has to be adjusted
int transitionDay;
int changeDayOfWeek = (int) transition.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, transition.Month))
transitionDay -= 7;
Console.WriteLine(" {0} {1}, {2:d} at {3:t}",
label,
transition.DayOfWeek,
new DateTime(year, transition.Month, transitionDay),
transition.TimeOfDay);
}
open System
open System.Globalization
let displayTransitionInfo (transition: TimeZoneInfo.TransitionTime) year label =
// For non-fixed date rules, get local calendar
let 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
let startOfWeek = transition.Week * 7 - 6
// What day of the week does the month start on?
let firstDayOfWeek = cal.GetDayOfWeek(DateTime(year, transition.Month, 1)) |> int
// Determine how much start date has to be adjusted
let changeDayOfWeek = int transition.DayOfWeek
let transitionDay =
if firstDayOfWeek <= changeDayOfWeek then
startOfWeek + (changeDayOfWeek - firstDayOfWeek)
else
startOfWeek + (7 - firstDayOfWeek + changeDayOfWeek)
// Adjust for months with no fifth week
let transitionDay =
if transitionDay > cal.GetDaysInMonth(year, transition.Month) then
transitionDay - 7
else
transitionDay
printfn $" {label} {transition.DayOfWeek}, {DateTime(year, transition.Month, transitionDay):d} at {transition.TimeOfDay:t}"
let getAdjustment (adjustments: TimeZoneInfo.AdjustmentRule seq) year =
adjustments
// Iterate adjustment rules for time zone
// Determine if this adjustment rule covers year desired
|> Seq.tryFind (fun adjustment -> adjustment.DateStart.Year <= year && adjustment.DateEnd >= DateTime year)
|> Option.defaultValue null
let getTransitionTimes year =
// Instantiate DateTimeFormatInfo object for month names
let dateFormat = CultureInfo.CurrentCulture.DateTimeFormat
// Get and iterate time zones on local computer
let timeZones = TimeZoneInfo.GetSystemTimeZones()
for timeZone in timeZones do
printfn $"{timeZone.StandardName}:"
let adjustments = timeZone.GetAdjustmentRules()
let startYear = year
let mutable endYear = startYear
if adjustments.Length = 0 then
printfn " No adjustment rules."
else
let adjustment = getAdjustment adjustments year
if adjustment = null then
Console.WriteLine(" No adjustment rules available for this year.")
else
// Determine if starting transition is fixed
let startTransition = adjustment.DaylightTransitionStart
// Determine if starting transition is fixed and display transition info for year
if startTransition.IsFixedDateRule then
printfn $" Begins on {dateFormat.GetMonthName startTransition.Month} {startTransition.Day} at {startTransition.TimeOfDay:t}"
else
displayTransitionInfo startTransition startYear "Begins on"
// Determine if ending transition is fixed and display transition info for year
let mutable endTransition = adjustment.DaylightTransitionEnd
// Does the transition back occur in an earlier month (i.e.,
// the following year) than the transition to DST? If so, make
// sure we have the right adjustment rule.
if endTransition.Month < startTransition.Month then
endTransition <- (getAdjustment adjustments (year + 1)).DaylightTransitionEnd
endYear <- endYear + 1
if endTransition.IsFixedDateRule then
printfn $" Ends on {dateFormat.GetMonthName endTransition.Month} {endTransition.Day} at {endTransition.TimeOfDay:t}"
else
displayTransitionInfo endTransition endYear "Ends on"
Private Sub GetTransitionTimes(year As Integer)
' Get and iterate time zones on local computer
Dim timeZones As ReadOnlyCollection(Of TimeZoneInfo) = TimeZoneInfo.GetSystemTimeZones()
For Each timeZone As TimeZoneInfo In timeZones
Console.WriteLine("{0}:", timeZone.StandardName)
Dim adjustments() As TimeZoneInfo.AdjustmentRule = timeZone.GetAdjustmentRules()
Dim startYear As Integer = year
Dim endYear As Integer = startYear
If adjustments.Length = 0 Then
Console.WriteLine(" No adjustment rules.")
Else
Dim adjustment As TimeZoneInfo.AdjustmentRule = GetAdjustment(adjustments, year)
If adjustment Is Nothing Then
Console.WriteLine(" No adjustment rules available for this year.")
Continue For
End If
Dim startTransition, endTransition As TimeZoneInfo.TransitionTime
' Determine if starting transition is fixed
startTransition = adjustment.DaylightTransitionStart
' Determine if starting transition is fixed and display transition info for year
If startTransition.IsFixedDateRule Then
Console.WriteLine(" Begins on {0} {1} at {2:t}", _
MonthName(startTransition.Month), _
startTransition.Day, _
startTransition.TimeOfDay)
Else
DisplayTransitionInfo(startTransition, startYear, "Begins on")
End If
' Determine if ending transition is fixed and display transition info for year
endTransition = adjustment.DaylightTransitionEnd
' Does the transition back occur in an earlier month (i.e.,
' the following year) than the transition to DST? If so, make
' sure we have the right adjustment rule.
If endTransition.Month < startTransition.Month Then
endTransition = GetAdjustment(adjustments, year + 1).DaylightTransitionEnd
endYear += 1
End If
If endTransition.IsFixedDateRule Then
Console.WriteLine(" Ends on {0} {1} at {2:t}", _
MonthName(endTransition.Month), _
endTransition.Day, _
endTransition.TimeOfDay)
Else
DisplayTransitionInfo(endTransition, endYear, "Ends on")
End If
End If
Next
End Sub
Private Function GetAdjustment(adjustments As TimeZoneInfo.AdjustmentRule(), _
year As Integer) As TimeZoneInfo.AdjustmentRule
' Iterate adjustment rules for time zone
For Each adjustment As TimeZoneInfo.AdjustmentRule In adjustments
' Determine if this adjustment rule covers year desired
If adjustment.DateStart.Year <= year And adjustment.DateEnd.Year >= year Then
Return adjustment
End If
Next
Return Nothing
End Function
Private Sub DisplayTransitionInfo(transition As TimeZoneInfo.TransitionTime, year As Integer, label As String)
' For non-fixed date rules, get local calendar
Static cal As Calendar = CultureInfo.CurrentCulture.Calendar
' Get first day of week for transition
' For example, the 3rd week starts no earlier than the 15th of the month
Dim startOfWeek As Integer = transition.Week * 7 - 6
' What day of the week does the month start on?
Dim firstDayOfWeek As Integer = cal.GetDayOfWeek(New Date(year, transition.Month, 1))
' Determine how much start date has to be adjusted
Dim transitionDay As Integer
Dim changeDayOfWeek As Integer = transition.DayOfWeek
If firstDayOfWeek <= changeDayOfWeek Then
transitionDay = startOfWeek + (changeDayOfWeek - firstDayOfWeek)
Else
transitionDay = startOfWeek + (7 - firstDayOfWeek + changeDayOfWeek)
End If
' Adjust for months with no fifth week
If transitionDay > cal.GetDaysInMonth(year, transition.Month) Then
transitionDay -= 7
End If
Console.WriteLine(" {0} {1}, {2:d} at {3:t}", _
label, _
transition.DayOfWeek, _
New DateTime(year, transition.Month, transitionDay), _
transition.TimeOfDay)
End Sub
注解
固定日期规则指示转换发生在应用调整规则的每个年份的同一日期和时间。 例如,每年 11 月 3 日发生的时间更改遵循固定日期规则。 浮动日期规则指示转换发生在应用调整规则的每一年的特定星期、特定月份的特定日期。 例如,在 11 月的第一个星期日发生的时间更改遵循浮动日期规则。
属性的值 IsFixedDateRule 确定对象的哪些属性 TimeZoneInfo.TransitionTime 具有有效值。 下表指示哪些属性受 属性的值 IsFixedDateRule 影响。
TransitionTime 属性 | IsFixedDateRule = true | IsFixedDateRule = false |
---|---|---|
Day |
有效 | 未使用 |
DayOfWeek |
未使用 | 有效 |
Week |
未使用 | 有效 |
Month |
有效 | 有效 |
TimeOfDay |
有效 | 有效 |