A mellékelt példában induláskor automatikusan meghívjuk a Kernel32.dll GetTimeZoneInformation nevű metódusát, és a visszaadott adathalmazt egy ListBox kontrolban jelenítjük meg. A metódust a Windows 95 verziójától kezdve használhatjuk.
A metódus meghívásához egy osztályt hozunk létre alkalmazásunkban, melynek neve TZClass lesz, és statikus metódusában – GetTimeZoneInfo – hívjuk meg az API függvényt.
A GetTimeZoneInformation függvény lekérdezi az időzónára vonatkozó operációs rendszer által nyilvántartott adatokat, és egy TIME_ZONE_INFORMATION nevű tömbben adja vissza a kapott értékeket. Annak érdekében, hogy C#-ból is meghívhassuk a metódust, deklarálnunk kell egy ilyen struktúrát.
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
struct TimeZoneInformation
{
public int bias;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string standardName;
public SystemTime standardDate;
public int standardBias;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string daylightName;
public SystemTime daylightDate;
public int daylightBias;
}
A struktúra fontos mezőinek adattartalmát a következő táblázat foglalja össze:
| Mezőnév |
Adattartalom |
| bias |
Az érték egy szám, mely kifejezi, hogy a helyi időt hány perccel kell csökkenteni vagy növelni ahhoz, hogy megkapjuk a Koordinált Egységesített Időt (UTC). A képlet: UTC = helyi idő + bias. A bias esetünkben -60. |
| standardName |
A számítógépen használatos standard időmérés neve. |
| standardDate |
Annak az időpontja egy SYSTEMTIME nevű struktúrában, amikor megtörténik a számítógépen az átállás a STANDARD és a DAYLIGHT időszámítás között. |
| daylightName |
Az időzónában használt másik időszámítás neve. |
| daylightDate |
Annak az időpontja egy SYSTEMTIME nevű struktúrában, amikor megtörténik a számítógépen az átállás a DAYLIGHT időszámításról a STANDARD időszámításra. |
A struktúrában kapott dátumok számára egy SYSTEMTIME nevű struktúrát is kell deklarálni, melyben a mezők egész számként tartalmazzák a dátumot.
struct SystemTime
{
public short wYear;
public short wMonth;
public short wDayOfWeek;
public short wDay;
public short wHour;
public short wMinute;
public short wSecond;
public short wMilliseconds;
}
A függvény sikeres végrehajtása esetén 0, 1 vagy 2 értékkel tér vissza, amennyiben nem sikerült a lekérdezés, a visszatérési értéke a 4 bájton ábrázolható legnagyobb érték.
A visszatérési értékek számára létrehoztunk egy felsorolt típust:
enum TZResult : uint
{
TIME_ZONE_ID_UNKNOWN = 0,
TIME_ZONE_ID_STANDARD = 1,
TIME_ZONE_ID_DAYLIGHT = 2,
TIME_ZONE_ID_INVALID = 0xFFFFFFFF
}
A GetTimeZoneInfo metódusunk egy karakterlánc-tömbbel tér vissza, melyben eltároljuk a kapott paramétereket, értelmes string-ekben megjelenítve azokat. Ehhez először példányosítjuk a paraméter struktúrát.
TimeZoneInformation timeZoneInfo = new TimeZoneInformation();
Majd meghívjuk a metódust.
TZResult res = GetTimeZoneInformation(ref timeZoneInfo);
...
A ListBox kontrolnak pedig átadjuk adatforrásként a tömböt.
listBox1.DataSource = TZClass.GetTimeZoneInfo();