Laden...

TIME_ZONE_INFORMATION (native) to TimeZoneInfo (managed)

Erstellt von nki vor 9 Jahren Letzter Beitrag vor 9 Jahren 2.271 Views
N
nki Themenstarter:in
11 Beiträge seit 2010
vor 9 Jahren
TIME_ZONE_INFORMATION (native) to TimeZoneInfo (managed)

Hallo zusammen,

hat jemand eine Idee, wie man die native Struktur TIME_ZONE_INFORMATION (Winbase.h) auf die managed Klasse TimeZoneInfo abbilden kann?

Ich schreibe momentan einen C++/CLI-Wrapper, in welchem ich diese Konvertierung benötige.

Dabei sieht die native Struktur folgendermaßen aus:


typedef struct _TIME_ZONE_INFORMATION {
  LONG       Bias;
  WCHAR      StandardName[32];
  SYSTEMTIME StandardDate;
  LONG       StandardBias;
  WCHAR      DaylightName[32];
  SYSTEMTIME DaylightDate;
  LONG       DaylightBias;
} TIME_ZONE_INFORMATION, *PTIME_ZONE_INFORMATION;

TimeZoneInfo hat folgende Properties:


System.TimeSpan BaseUtcOffset
System.String DaylightName
System.String DisplayName
System.String Id
System.TimeZoneInfo Local
System.String StandardName
System.Boolean SupportsDaylightSavingTime
System.TimeZoneInfo Utc

StandardName und DaylightName ist klar. Leider weiß ich nicht wie ich den Rest abbilden soll.

Folgende Fragen stellen sich mir:

Wie bestimme ich anhand der Informationen aus der nativen Struktur den BaseUtcOffset?

Woher bekomme ich den DisplayName? Dieser ist nicht in der nativen Struktur enthalten.
Woher bekomme ich die Id? Angenommen wir nehmen die Mitteleuropäische Zeit, dann bekomm ich ich auf managed Seite die Id: "W. Europe Standard Time". Diese Infos bekomme ich aber nicht aus der nativen Struktur. Gibt es dazu andere Alternativen? Wenn ich anhand meiner nativen Daten eindeutig die Zeitzone identifizieren kann, kann ich mir die Strings ja auch gegebenfalls aus den entsprechenden managed Funktionen holen.

Selbes gilt für DisplayName "(UTC+01:00) Amsterdam, Berlin, Bern, Rom, Stockholm, Wien".

Wie bestimme ich Local und Utc (anhand meiner vorliegenden nativen Daten)?

Danke im Voraus.

Gruß
nki

D
500 Beiträge seit 2007
vor 9 Jahren

Moin,

sag mal, hast Du schon mal hier geschaut Time_Zone_Information @ PInvoke

Nachtrag: Sorry, der Link wird Dir wahrscheinlich bei Deiner Frage zur "Konvertierung" nicht weiterhelfen.

Gruss,
DaMoe

N
nki Themenstarter:in
11 Beiträge seit 2010
vor 9 Jahren

Hi Moe,

jap, da bin ich auch schon drüber gestolpert 😃

Leider bringt mich das nicht wirklich weiter, da ich (wie du schon nachgetragen hast) kein PInvoke verwende.

Zum Thema baseUtcOffset bin ich schon ein Stück weitergekommen. Da stand ich wohl auf dem Schlauch. Der Bias scheintwohl gleich des BaseUtcOffset zu sein.

Gruß
nki

4.931 Beiträge seit 2008
vor 9 Jahren

Hallo nki,

am besten du schaust dir z.B. mittels des .NET-Reflectors oder aber Jade.NET (C# - Decompiler) mal den internen Code von TimeZoneInfo an.

Ich habe den mal als Anhang hier angefügt - dort siehst du wie aus dem nativen die managed Struktur erstellt wird (private TimeZoneInfo(Win32Native.TimeZoneInformation zone, bool dstDisabled)).

Evtl. könntest du auch einfach per Reflection diesen privaten Konstruktor aufrufen...

D
500 Beiträge seit 2007
vor 9 Jahren

Hallo,

Th69 hat Recht. Man kann sich das gut im .Net Code abgucken. Bei Reflection auf private Konstrukte wie z.B. hier den Konstruktor, egal ob von MS oder eigenem Code, waere ich immer sehr vorsichtig.

Nur am Rande: Man kann sich den Code sehr schnell und auch schick mittels der Microsoft Reference Source .Net 4.5.1 anschauen.

Gruss,
DaMoe

N
nki Themenstarter:in
11 Beiträge seit 2010
vor 9 Jahren

Hallo Th69,

coole Sache! Ich danke dir! 😃
Das sieht schon mal gut aus. Ich denke, dass mich das weiterbringt.

Eines verwirrt mich dabei jedoch:

wenn der StandardName null/empty ist, dann ist die Id = "Local". Ok.. Wenn dies nicht der Fall ist, ist die Id dann der StandardName:


        if (string.IsNullOrEmpty(zone.StandardName))
        {
            this.m_id = "Local";
        }
        else
        {
            this.m_id = zone.StandardName;
        }

In einem kleinen Testprogramm sehe ich jedoch eine andere Id. Dabei habe ich folgendes gemacht:

var list = TimeZoneInfo.GetSystemTimeZones();

Der StandardName hier in der zurückgegebenen Liste ist "Mitteleuropäische Zeit" (am Beispiel UTC+1, Berlin). Dieser stimmt auch mit dem StandardName meiner nativen Struktur überein. Soweit ok.
Die Id dieses Listeneintrags ist jedoch "W. Europe Standard Time".
Müsste diese laut dem obigen Reflactor-Quelltext nicht mit dem StandardName übereinstimmen?
(siehe Screenshot).

EDIT: Danke euch beiden, für die guten Hilfestellungen. Dann durchstöbere ich einfach mal den Source 😃

Danke & Gruß
nki