TimeZoneInfo.TransitionTime.IsFixedDateRule Propriedade
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
Obtém um valor que indica se a alteração de hora ocorre em uma data e hora fixas (como 1º de novembro) ou data e hora flutuante (por exemplo, o último domingo de outubro).
public:
property bool IsFixedDateRule { bool get(); };
public bool IsFixedDateRule { get; }
member this.IsFixedDateRule : bool
Public ReadOnly Property IsFixedDateRule As Boolean
Valor da propriedade
true
se a regra de mudança de horário for de data fixa; false
se a regra de mudança de horário de for de data flutuante.
Exemplos
O exemplo a seguir lista os horários de transição de e para o horário de verão para todos os fusos horários disponíveis no sistema local. Para fusos horários com regras de data fixa, ele exibe informações de tempo de transição das propriedades do TimeZoneInfo.TransitionTime objeto. Para fusos horários sem regras de data fixa, ele usa um Calendar objeto que representa o calendário atual do sistema para determinar as datas de início e término reais da transição. O exemplo exibe os resultados no console.
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
Comentários
Uma regra de data fixa indica que a transição ocorre na mesma data e hora de cada ano para a qual a regra de ajuste se aplica. Por exemplo, uma alteração de tempo que ocorre a cada 3 de novembro segue uma regra de data fixa. Uma regra de data flutuante indica que a transição ocorre em um dia específico de uma semana específica de um mês específico para cada ano ao qual a regra de ajuste se aplica. Por exemplo, uma alteração de tempo que ocorre no primeiro domingo de novembro segue uma regra de data flutuante.
O valor da IsFixedDateRule propriedade determina quais propriedades de um TimeZoneInfo.TransitionTime objeto têm valores válidos. A tabela a seguir indica quais propriedades são afetadas pelo valor da IsFixedDateRule propriedade.
Propriedade TransitionTime | IsFixedDateRule = true | IsFixedDateRule = false |
---|---|---|
Day |
Válido | Não usado |
DayOfWeek |
Não usado | Válido |
Week |
Não usado | Válido |
Month |
Válido | Válido |
TimeOfDay |
Válido | Válido |