Changes from GMT to BST and back occur at fixed points in the calendar, last Sundays of March and October. The rules for converting are set in every computer of every operating system. You get the correct time for any time of the year just by requesting the time in local format. You can adjust the timezone required by setting environment variables, and using the standard libraries to do the conversion. If you want to do it manually then you need to unsderstand the structure of the registry entries for timezones as follows:
Retrieving Time-Zone Information
Article ID: Q115231
The information in this article applies to:
Microsoft Win32 Application Programming Interface (API) included with:
- Microsoft Windows NT versions 3.1, 3.5, and 3.51
- Microsoft Windows 95 version 4.0
In Windows NT, version 3.1, the time-zone strings are compiled into a resource that is linked into the CONTROL.EXE file. For Windows NT, version 3.5 and later and Windows 95, the time-zone strings have been moved into the registry.
In Windows NT, the time-zone strings are located in the key:
HKEY_LOCAL_MACHINE\SOFTWARE\
Microsoft\
Windows NT\
CurrentVersion\
Time Zones.
In Windows 95, the time-zone strings are located in the key:
HKEY_LOCAL_MACHINE\SOFTWARE\
Microsoft\
Windows\
CurrentVersion\
Time Zones.
For each time zone, the registry key TZI is formatted as follows:
LONG Bias;
LONG StandardBias;
LONG DaylightBias;
SYSTEMTIME StandardDate;
SYSTEMTIME DaylightDate;
You can use this information to fill out a TIME_ZONE_INFORMATION
structure, which is used when calling SetTimeZoneInformation().
0xffffffc4
00000000
0xffffffc4
Year Month dow day hour min sec msec
0000 000A 0000 0005 0003 0000 0000 0000
0000 0003 0000 0005 0002 0000 0000 0000
--------------------------------------------------------------------------------
TIME_ZONE_INFORMATION
The TIME_ZONE_INFORMATION structure specifies information
specific to the time zone.
typedef struct _TIME_ZONE_INFORMATION { // tzi
LONG Bias;
WCHAR StandardName[ 32 ];
SYSTEMTIME StandardDate;
LONG StandardBias;
WCHAR DaylightName[ 32 ];
SYSTEMTIME DaylightDate;
LONG DaylightBias;
} TIME_ZONE_INFORMATION;
Members
Bias
Specifies the current bias, in minutes, for local time
translation on this computer. The bias is the difference, in
minutes, between Coordinated Universal Time (UTC) and local
time. All translations between UTC and local time are based on
the following formula:
UTC = local time + bias
This member is required.
StandardName
Specifies a null-terminated string associated with standard
time on this operating system. For example, this parameter
could contain "EST" to indicate Eastern Standard Time. This
string is not used by the operating system, so anything stored
there by using the SetTimeZoneInformation function is returned
unchanged by the GetTimeZoneInformation function. This string
can be empty.
StandardDate
Specifies a SYSTEMTIME structure that contains a date and local
time when the transition from daylight time to standard time
occurs on this operating system. If this date is not specified,
the wMonth member in the SYSTEMTIME structure must be zero. If
this date is specified, the DaylightDate value in the
TIME_ZONE_INFORMATION structure must also be specified.
This member supports two date formats. Absolute format
specifies an exact date and time when standard time begins. In
this form, the wYear, wMonth, wDay, wHour, wMinute, wSecond,
and wMilliseconds members of the SYSTEMTIME structure are used
to specify an exact date.
Day-in-month format is specified by setting the wYear member
to zero, setting the wDayOfWeek member to an appropriate
weekday, and using a wDay value in the range 1 through 5 to
select the correct day in the month. Using this notation, the
first Sunday in April can be specified, as can the last
Thursday in October (5 is equal to "the last").
StandardBias
Specifies a bias value to be used during local time
translations that occur during standard time. This member is
ignored if a value for the StandardDate member is not supplied.
This value is added to the value of the Bias member to form
the bias used during standard time. In most time zones, the
value of this member is zero.
DaylightName
Specifies a null-terminated string associated with daylight
time on this operating system. For example, this parameter
could contain "PDT" to indicate Pacific Daylight Time. This
string is not used by the operating system, so anything stored
there by using the SetTimeZoneInformation function is returned
unchanged by the GetTimeZoneInformation function. This string
can be empty.
DaylightDate
Specifies a SYSTEMTIME structure that contains a date and
local time when the transition from standard time to daylight
time occurs on this operating system. If this date is not
specified, the wMonth member in the SYSTEMTIME structure must
be zero. If this date is specified, the StandardDate value in
the TIME_ZONE_INFORMATION structure must also be specified.
This member supports the absolute and day-in-month time formats
described for the StandardDate member.
DaylightBias
Specifies a bias value to be used during local time translations
that occur during daylight time. This member is ignored if a
value for the DaylightDate member is not supplied.
This value is added to the value of the Bias member to form the
bias used during daylight time. In most time zones, the value of
this member is – 60.
See Also
Time Overview,
Time Structures,
GetTimeZoneInformation,
SetTimeZoneInformation,
SYSTEMTIME