2009-06-04 6 views
3

Hey, ich habe ein TimeZoneInfo Objekt und von diesem möchte ich eine TIME_ZONE_INFO Struktur erstellen.TimeZoneInfo zu TIME_ZONE_INFORMATION Struktur

Bias, StandardDate und DaylightDate sind ziemlich einfach zu erhalten. Ich habe jedoch Probleme mit Standardbias und daylightbias. Die Frage ist also, wie kann ich die Standardbias von einem TimeZOneInfo-Objekt bekommen und wie bekomme ich das gleiche für Tageslichtbias (es gibt eine AdjustmentRule.DaylightDelta, aber wie Sie sehen können, brauche ich den Offset nicht das Delta).

Danke.

Antwort

0

Die TIME_ZONE_INFORMATION Hilfe ist ziemlich nützlich. Es besagt, dass die Standardbia für die meisten Zeitzonen 0 ist. Es macht für mich wenig Sinn, eine Zeitzone zu haben, in der die Standardabweichung nicht Null ist. Ist das nicht was "Standard" bedeutet?

Der DaylightDelta ist der Unterschied zwischen dem Standard-UTC-Offset und dem Tageslicht-UTC-Offset. DaylightBias ist auf die gleiche Weise definiert, also ist Ihr DaylightDelta Ihr DaylightBias.

Ich kann das jetzt nicht hacken, aber ich schlage vor, mit den Daten in Ihrer Zeitzone herumzuspielen. Alternativ gibt es eine Möglichkeit, Win32-Objekte zu get die TIME_ZONE_INFORMATION-Struktur für die entsprechende TimeZoneInfo anstelle des Objekts zu erstellen? So etwas wie GetTimeZoneInformationForYear durch Angabe der TimeZoneInfo.StandardName in DYNAMIC_TIME_ZONE_INFORMATION.StandardName?

1

Ich habe diesen Code mit den Ergebnissen der Verwendung von CrankedUp (die TIME_ZONE_INFORMATION liest) verglichen und die Ergebnisse sind identisch auf meinem Windows XP SP3-Computer. Ihre Ergebnisse können variieren.

TimeZoneInfo.AdjustmentRule[] adjustmentRules = timeZoneInfo.GetAdjustmentRules(); 
TimeZoneInfo.AdjustmentRule adjustmentRule = null; 
if (adjustmentRules.Length > 0) 
{ 
    // Find the single record that encompasses today's date. If none exists, sets adjustmentRule to null. 
    adjustmentRule = adjustmentRules.SingleOrDefault(ar => ar.DateStart <= DateTime.Now && DateTime.Now <= ar.DateEnd); 
} 

double bias = -timeZoneInfo.BaseUtcOffset.TotalMinutes; // I'm not sure why this number needs to be negated, but it does. 
string daylightName = timeZoneInfo.DaylightName; 
string standardName = timeZoneInfo.StandardName; 
double daylightBias = adjustmentRule == null ? -60 : -adjustmentRule.DaylightDelta.TotalMinutes; // Not sure why default is -60, or why this number needs to be negated, but it does. 
int daylightDay = 0; 
int daylightDayOfWeek = 0; 
int daylightHour = 0; 
int daylightMonth = 0; 
int standardDay = 0; 
int standardDayOfWeek = 0; 
int standardHour = 0; 
int standardMonth = 0; 

if (adjustmentRule != null) 
{ 
    TimeZoneInfo.TransitionTime daylightTime = adjustmentRule.DaylightTransitionStart; 
    TimeZoneInfo.TransitionTime standardTime = adjustmentRule.DaylightTransitionEnd; 

    // Valid values depend on IsFixedDateRule: http://msdn.microsoft.com/en-us/library/system.timezoneinfo.transitiontime.isfixeddaterule. 
    daylightDay = daylightTime.IsFixedDateRule ? daylightTime.Day : daylightTime.Week; 
    daylightDayOfWeek = daylightTime.IsFixedDateRule ? -1 : (int)daylightTime.DayOfWeek; 
    daylightHour = daylightTime.TimeOfDay.Hour; 
    daylightMonth = daylightTime.Month; 

    standardDay = standardTime.IsFixedDateRule ? standardTime.Day : standardTime.Week; 
    standardDayOfWeek = standardTime.IsFixedDateRule ? -1 : (int)standardTime.DayOfWeek; 
    standardHour = standardTime.TimeOfDay.Hour; 
    standardMonth = standardTime.Month; 
}