Rev 81629 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed
/** R : A Computer Language for Statistical Data Analysis* Copyright (C) 2007-2023 The R Core Team** This program is free software; you can redistribute it and/or modify* it under the terms of the GNU General Public License as published by* the Free Software Foundation; either version 2 of the License, or* (at your option) any later version.** This program is distributed in the hope that it will be useful,* but WITHOUT ANY WARRANTY; without even the implied warranty of* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the* GNU General Public License for more details.** You should have received a copy of the GNU General Public License* along with this program; if not, a copy is available at* https://www.R-project.org/Licenses/*/#include <string.h>#ifdef USE_ICU#define UCHAR_TYPE wchar_t#include "unicode/ucal.h"#endif/*Updated using CLDR 42 (cldr-release-42/common/supplemental/windowsZones.xml),keeping old entries for Windows time zones not present in CLDR42.From http://unicode.org/cldr/data/diff/supplemental/windows_tzid.htmlAdded some entries from the XP Registry (and checked on Vista).Table updated from Unicode in August 2015.*/const static struct {const wchar_t * const reg;const char * const Olson;} TZtable[] = {{ L"Afghanistan Standard Time", "Asia/Kabul" },{ L"Alaskan Standard Time", "America/Anchorage" },{ L"Arab Standard Time", "Asia/Riyadh" },{ L"Arabian Standard Time", "Asia/Dubai" },{ L"Arabic Standard Time", "Asia/Baghdad" },{ L"Armenian Standard Time", "Asia/Yerevan" },{ L"Atlantic Standard Time", "America/Halifax" },{ L"AUS Central Standard Time", "Australia/Darwin" },{ L"AUS Eastern Standard Time", "Australia/Sydney" },{ L"Azerbaijan Standard Time", "Asia/Baku" },{ L"Azores Standard Time", "Atlantic/Azores" },{ L"Canada Central Standard Time", "America/Regina" },{ L"Cape Verde Standard Time", "Atlantic/Cape_Verde" },{ L"Caucasus Standard Time", "Asia/Yerevan" },{ L"Cen. Australia Standard Time", "Australia/Adelaide" },{ L"Central America Standard Time", "America/Guatemala" },{ L"Central Asia Standard Time", "Asia/Almaty" },{ L"Central Brazilian Standard Time", "America/Cuiaba" },{ L"Central Europe Standard Time", "Europe/Budapest" },{ L"Central European Standard Time", "Europe/Warsaw" },{ L"Central Pacific Standard Time", "Pacific/Guadalcanal" },{ L"Central Standard Time", "America/Chicago" },{ L"Central Standard Time (Mexico)", "America/Mexico_City" },{ L"China Standard Time", "Asia/Shanghai" },{ L"Dateline Standard Time", "Etc/GMT+12" },{ L"E. Africa Standard Time", "Africa/Nairobi" },{ L"E. Australia Standard Time", "Australia/Brisbane" },{ L"E. Europe Standard Time", "Europe/Chisinau" },{ L"E. South America Standard Time", "America/Sao_Paulo" },{ L"Eastern Standard Time", "America/New_York" },{ L"Egypt Standard Time", "Africa/Cairo" },{ L"Ekaterinburg Standard Time", "Asia/Yekaterinburg" },{ L"Fiji Standard Time", "Pacific/Fiji" },{ L"FLE Standard Time", "Europe/Kiev" },{ L"Georgian Standard Time", "Asia/Tbilisi" },{ L"GMT Standard Time", "Europe/London" },{ L"Greenland Standard Time", "America/Godthab" },{ L"Greenwich Standard Time", "Atlantic/Reykjavik" },{ L"GTB Standard Time", "Europe/Bucharest" },{ L"Hawaiian Standard Time", "Pacific/Honolulu" },{ L"India Standard Time", "Asia/Calcutta" },{ L"Iran Standard Time", "Asia/Tehran" },/* next is name of timezone, not of Std */{ L"Israel Standard Time", "Asia/Jerusalem" },{ L"Jerusalem Standard Time", "Asia/Jerusalem" },{ L"Jordan Standard Time", "Asia/Amman" },{ L"Korea Standard Time", "Asia/Seoul" },{ L"Malay Peninsula Standard Time", "Asia/Kuala_Lumpur" },{ L"Mexico Standard Time", "America/Mexico_City" },{ L"Mexico Standard Time 2", "America/Chihuahua" },{ L"Mid-Atlantic Standard Time", "America/Noronha" },{ L"Middle East Standard Time", "Asia/Beirut" },{ L"Montevideo Standard Time", "America/Montevideo" },{ L"Mountain Standard Time", "America/Denver" },{ L"Mountain Standard Time (Mexico)", "America/Chihuahua" },{ L"Myanmar Standard Time", "Asia/Rangoon" },{ L"N. Central Asia Standard Time", "Asia/Novosibirsk" },{ L"Namibia Standard Time", "Africa/Windhoek" },{ L"Nepal Standard Time", "Asia/Katmandu" },{ L"New Zealand Standard Time", "Pacific/Auckland" },{ L"Newfoundland Standard Time", "America/St_Johns" },{ L"North Asia East Standard Time", "Asia/Irkutsk" },{ L"North Asia Standard Time", "Asia/Krasnoyarsk" },{ L"Pacific SA Standard Time", "America/Santiago" },{ L"Pacific Standard Time", "America/Los_Angeles" },{ L"Pacific Standard Time (Mexico)", "America/Tijuana" },{ L"Romance Standard Time", "Europe/Paris" },{ L"Russian Standard Time", "Europe/Moscow" },{ L"SA Eastern Standard Time", "America/Cayenne" },{ L"SA Pacific Standard Time", "America/Bogota" },{ L"SA Western Standard Time", "America/La_Paz" },{ L"Samoa Standard Time", "Pacific/Apia" },{ L"SE Asia Standard Time", "Asia/Bangkok" },/* next is name of timezone, not of Std */{ L"Singapore Standard Time", "Asia/Singapore" },{ L"South Africa Standard Time", "Africa/Johannesburg" },{ L"Sri Lanka Standard Time", "Asia/Colombo" },{ L"Taipei Standard Time", "Asia/Taipei" },{ L"Tasmania Standard Time", "Australia/Hobart" },{ L"Tokyo Standard Time", "Asia/Tokyo" },{ L"Tonga Standard Time", "Pacific/Tongatapu" },{ L"US Eastern Standard Time", "America/Indianapolis" },{ L"US Mountain Standard Time", "America/Phoenix" },{ L"Venezuela Standard Time", "America/Caracas" },{ L"Vladivostok Standard Time", "Asia/Vladivostok" },{ L"W. Australia Standard Time", "Australia/Perth" },{ L"W. Central Africa Standard Time", "Africa/Lagos" },{ L"W. Europe Standard Time", "Europe/Berlin" },{ L"West Asia Standard Time", "Asia/Tashkent" },{ L"West Pacific Standard Time", "Pacific/Port_Moresby" },{ L"Yakutsk Standard Time", "Asia/Yakutsk" },/* The ones below do not occur on BDR's XP machine */{ L"Acre Standard Time", "America/Rio_Branco" },{ L"Africa_Central Standard Time", "Africa/Kigali" },{ L"Africa_Eastern Standard Time", "Africa/Kampala" },{ L"Africa_FarWestern Standard Time", "Africa/El_Aaiun" },{ L"Africa_Southern Standard Time", "Africa/Johannesburg" },{ L"Africa_Western Standard Time", "Africa/Niamey" },{ L"Aktyubinsk Standard Time", "Asia/Aqtobe" },{ L"Alaska Standard Time", "America/Juneau" },{ L"Alaska_Hawaii Standard Time", "America/Anchorage" },{ L"Almaty Standard Time", "Asia/Almaty" },{ L"Amazon Standard Time", "America/Manaus" },{ L"America_Central Standard Time", "America/Winnipeg" },{ L"America_Eastern Standard Time", "America/Panama" },{ L"America_Mountain Standard Time", "America/Edmonton" },{ L"America_Pacific Standard Time", "America/Vancouver" },{ L"Anadyr Standard Time", "Asia/Anadyr" },{ L"Aqtau Standard Time", "Asia/Aqtau" },{ L"Aqtobe Standard Time", "Asia/Aqtobe" },{ L"Argentina Standard Time", "America/Buenos_Aires" },{ L"Argentina_Western Standard Time", "America/Mendoza" },{ L"Armenia Standard Time", "Asia/Yerevan" },{ L"Ashkhabad Standard Time", "Asia/Ashgabat" },{ L"Australia_Central Standard Time", "Australia/Adelaide" },{ L"Australia_CentralWestern Standard Time", "Australia/Eucla" },{ L"Australia_Eastern Standard Time", "Australia/Sydney" },{ L"Australia_Western Standard Time", "Australia/Perth" },{ L"Baku Standard Time", "Asia/Baku" },{ L"Bangladesh Standard Time", "Asia/Dhaka" },{ L"Bering Standard Time", "America/Adak" },{ L"Bhutan Standard Time", "Asia/Thimphu" },{ L"Bolivia Standard Time", "America/La_Paz" },{ L"Borneo Standard Time", "Asia/Kuching" },{ L"Brasilia Standard Time", "America/Sao_Paulo" },{ L"British Standard Time", "Europe/London" },{ L"Brunei Standard Time", "Asia/Brunei" },{ L"Chamorro Standard Time", "Pacific/Guam" },{ L"Changbai Standard Time", "Asia/Harbin" },{ L"Chatham Standard Time", "Pacific/Chatham" },{ L"Chile Standard Time", "America/Santiago" },{ L"Choibalsan Standard Time", "Asia/Choibalsan" },{ L"Christmas Standard Time", "Indian/Christmas" },{ L"Cocos Standard Time", "Indian/Cocos" },{ L"Colombia Standard Time", "America/Bogota" },{ L"Cook Standard Time", "Pacific/Rarotonga" },{ L"Cuba Standard Time", "America/Havana" },{ L"Dacca Standard Time", "Asia/Dhaka" },{ L"Davis Standard Time", "Antarctica/Davis" },{ L"Dominican Standard Time", "America/Santo_Domingo" },{ L"DumontDUrville Standard Time", "Antarctica/DumontDUrville" },{ L"Dushanbe Standard Time", "Asia/Dushanbe" },{ L"Dutch_Guiana Standard Time", "America/Paramaribo" },{ L"East_Timor Standard Time", "Asia/Dili" },{ L"Easter Standard Time", "Pacific/Easter" },{ L"Ecuador Standard Time", "America/Guayaquil" },{ L"Europe_Central Standard Time", "Europe/Oslo" },{ L"Europe_Eastern Standard Time", "Europe/Vilnius" },{ L"Europe_Western Standard Time", "Atlantic/Canary" },{ L"Falkland Standard Time", "Atlantic/Stanley" },{ L"French_Guiana Standard Time", "America/Cayenne" },{ L"French_Southern Standard Time", "Indian/Kerguelen" },{ L"Frunze Standard Time", "Asia/Bishkek" },{ L"Galapagos Standard Time", "Pacific/Galapagos" },{ L"Gambier Standard Time", "Pacific/Gambier" },{ L"Georgia Standard Time", "Asia/Tbilisi" },{ L"Gilbert_Islands Standard Time", "Pacific/Tarawa" },{ L"Goose_Bay Standard Time", "America/Goose_Bay" },{ L"Greenland_Central Standard Time", "America/Scoresbysund" },{ L"Greenland_Eastern Standard Time", "America/Scoresbysund" },{ L"Greenland_Western Standard Time", "America/Godthab" },{ L"Guam Standard Time", "Pacific/Guam" },{ L"Gulf Standard Time", "Asia/Muscat" },{ L"Guyana Standard Time", "America/Guyana" },{ L"Hawaii_Aleutian Standard Time", "Pacific/Honolulu" },{ L"Hong_Kong Standard Time", "Asia/Hong_Kong" },{ L"Hovd Standard Time", "Asia/Hovd" },{ L"Indian_Ocean Standard Time", "Indian/Chagos" },{ L"Indochina Standard Time", "Asia/Vientiane" },{ L"Indonesia_Central Standard Time", "Asia/Makassar" },{ L"Indonesia_Eastern Standard Time", "Asia/Jayapura" },{ L"Indonesia_Western Standard Time", "Asia/Jakarta" },{ L"Irish Standard Time", "Europe/Dublin" },{ L"Irkutsk Standard Time", "Asia/Irkutsk" },{ L"Japan Standard Time", "Asia/Tokyo" },{ L"Kamchatka Standard Time", "Asia/Kamchatka" },{ L"Karachi Standard Time", "Asia/Karachi" },{ L"Kashgar Standard Time", "Asia/Kashgar" },{ L"Kazakhstan_Eastern Standard Time", "Asia/Almaty" },{ L"Kazakhstan_Western Standard Time", "Asia/Aqtobe" },{ L"Kizilorda Standard Time", "Asia/Qyzylorda" },{ L"Kosrae Standard Time", "Pacific/Kosrae" },{ L"Krasnoyarsk Standard Time", "Asia/Krasnoyarsk" },{ L"Kuybyshev Standard Time", "Europe/Samara" },{ L"Kwajalein Standard Time", "Pacific/Kwajalein" },{ L"Kyrgystan Standard Time", "Asia/Bishkek" },{ L"Lanka Standard Time", "Asia/Colombo" },{ L"Liberia Standard Time", "Africa/Monrovia" },{ L"Line_Islands Standard Time", "Pacific/Kiritimati" },{ L"Long_Shu Standard Time", "Asia/Chongqing" },{ L"Lord_Howe Standard Time", "Australia/Lord_Howe" },{ L"Macau Standard Time", "Asia/Macau" },{ L"Magadan Standard Time", "Asia/Magadan" },{ L"Malaya Standard Time", "Asia/Kuala_Lumpur" },{ L"Malaysia Standard Time", "Asia/Kuching" },{ L"Maldives Standard Time", "Indian/Maldives" },{ L"Marquesas Standard Time", "Pacific/Marquesas" },{ L"Marshall_Islands Standard Time", "Pacific/Majuro" },{ L"Mauritius Standard Time", "Indian/Mauritius" },{ L"Mawson Standard Time", "Antarctica/Mawson" },{ L"Mongolia Standard Time", "Asia/Ulaanbaatar" },{ L"Moscow Standard Time", "Europe/Moscow" },{ L"Nauru Standard Time", "Pacific/Nauru" },{ L"New_Caledonia Standard Time", "Pacific/Noumea" },{ L"New_Zealand Standard Time", "Pacific/Auckland" },{ L"Niue Standard Time", "Pacific/Niue" },{ L"Norfolk Standard Time", "Pacific/Norfolk" },{ L"Noronha Standard Time", "America/Noronha" },{ L"North_Mariana Standard Time", "Pacific/Saipan" },{ L"Novosibirsk Standard Time", "Asia/Novosibirsk" },{ L"Omsk Standard Time", "Asia/Omsk" },{ L"Oral Standard Time", "Asia/Oral" },{ L"Pakistan Standard Time", "Asia/Karachi" },{ L"Palau Standard Time", "Pacific/Palau" },{ L"Papua_New_Guinea Standard Time", "Pacific/Port_Moresby" },{ L"Paraguay Standard Time", "America/Asuncion" },{ L"Peru Standard Time", "America/Lima" },{ L"Philippines Standard Time", "Asia/Manila" },{ L"Phoenix_Islands Standard Time", "Pacific/Enderbury" },{ L"Pierre_Miquelon Standard Time", "America/Miquelon" },{ L"Pitcairn Standard Time", "Pacific/Pitcairn" },{ L"Ponape Standard Time", "Pacific/Ponape" },{ L"Qyzylorda Standard Time", "Asia/Qyzylorda" },{ L"Reunion Standard Time", "Indian/Reunion" },{ L"Rothera Standard Time", "Antarctica/Rothera" },{ L"Sakhalin Standard Time", "Asia/Sakhalin" },{ L"Samara Standard Time", "Europe/Samara" },{ L"Samarkand Standard Time", "Asia/Samarkand" },{ L"Seychelles Standard Time", "Indian/Mahe" },{ L"Shevchenko Standard Time", "Asia/Aqtau" },{ L"Solomon Standard Time", "Pacific/Guadalcanal" },{ L"South_Georgia Standard Time", "Atlantic/South_Georgia" },{ L"Suriname Standard Time", "America/Paramaribo" },{ L"Sverdlovsk Standard Time", "Asia/Yekaterinburg" },{ L"Syowa Standard Time", "Antarctica/Syowa" },{ L"Tahiti Standard Time", "Pacific/Tahiti" },{ L"Tajikistan Standard Time", "Asia/Dushanbe" },{ L"Tashkent Standard Time", "Asia/Tashkent" },{ L"Tbilisi Standard Time", "Asia/Tbilisi" },{ L"Tokelau Standard Time", "Pacific/Fakaofo" },{ L"Truk Standard Time", "Pacific/Truk" },{ L"Turkey Standard Time", "Europe/Istanbul" },{ L"Turkmenistan Standard Time", "Asia/Ashgabat" },{ L"Tuvalu Standard Time", "Pacific/Funafuti" },{ L"Uralsk Standard Time", "Asia/Oral" },{ L"Uruguay Standard Time", "America/Montevideo" },{ L"Urumqi Standard Time", "Asia/Urumqi" },{ L"Uzbekistan Standard Time", "Asia/Tashkent" },{ L"Vanuatu Standard Time", "Pacific/Efate" },{ L"Volgograd Standard Time", "Europe/Volgograd" },{ L"Vostok Standard Time", "Antarctica/Vostok" },{ L"Wake Standard Time", "Pacific/Wake" },{ L"Wallis Standard Time", "Pacific/Wallis" },{ L"Yekaterinburg Standard Time", "Asia/Yekaterinburg" },{ L"Yerevan Standard Time", "Asia/Yerevan" },{ L"Yukon Standard Time", "America/Whitehorse" },/* 2015 additions, seen in then-current Windows 7 */{ L"Bahia Standard Time", "America/Bahia" },{ L"Belarus Standard Time", "Europe/Minsk" },{ L"Kaliningrad Standard Time", "Europe/Kaliningrad" },{ L"Libya Standard Time", "Africa/Tripoli" },{ L"Morocco Standard Time", "Africa/Casablanca" },{ L"Syria Standard Time", "Asia/Damascus" },{ L"Ulaanbaatar Standard Time", "Asia/Ulaanbaatar" },// See https://support.microsoft.com/en-gb/gp/cp_dst{ L"Russia Time Zone 1", "Europe/Kaliningrad" },{ L"Russia Time Zone 2", "Europe/Moscow" },{ L"Russia Time Zone 3", "Europe/Samara" },{ L"Russia Time Zone 4", "Asia/Yekaterinburg" },{ L"Russia Time Zone 5", "Asia/Novosibirsk" },{ L"Russia Time Zone 6", "Asia/Krasnoyarsk" },{ L"Russia Time Zone 7", "Asia/Irkutsk" },{ L"Russia Time Zone 8", "Asia/Yakutsk" },{ L"Russia Time Zone 9", "Asia/Magadan" },{ L"Russia Time Zone 10", "Asia/Srednekolymsk" },{ L"Russia Time Zone 11", "Asia/Kamchatka" },/* 2023 additions from CLDR 42 (windowsZones.xml) */{ L"Aleutian Standard Time", "America/Adak" },{ L"Altai Standard Time", "Asia/Barnaul" },{ L"Astrakhan Standard Time", "Europe/Astrakhan" },{ L"Aus Central W. Standard Time", "Australia/Eucla" },{ L"Bougainville Standard Time", "Pacific/Bougainville" },{ L"Chatham Islands Standard Time", "Pacific/Chatham" },{ L"Easter Island Standard Time", "Pacific/Easter" },{ L"Eastern Standard Time (Mexico)", "America/Cancun" },{ L"Haiti Standard Time", "America/Port-au-Prince" },{ L"Line Islands Standard Time", "Pacific/Kiritimati" },{ L"Lord Howe Standard Time", "Australia/Lord_Howe" },{ L"Magallanes Standard Time", "America/Punta_Arenas" },{ L"North Korea Standard Time", "Asia/Pyongyang" },{ L"Saint Pierre Standard Time", "America/Miquelon" },{ L"Sao Tome Standard Time", "Africa/Sao_Tome" },{ L"Saratov Standard Time", "Europe/Saratov" },{ L"South Sudan Standard Time", "Africa/Juba" },{ L"Sudan Standard Time", "Africa/Khartoum" },{ L"Tocantins Standard Time", "America/Araguaina" },{ L"Tomsk Standard Time", "Asia/Tomsk" },{ L"Transbaikal Standard Time", "Asia/Chita" },{ L"Turks And Caicos Standard Time", "America/Grand_Turk" },{ L"UTC-02", "Etc/GMT+2" },{ L"UTC-08", "Etc/GMT+8" },{ L"UTC-09", "Etc/GMT+9" },{ L"UTC-11", "Etc/GMT+11" },{ L"UTC+12", "Etc/GMT-12" },{ L"UTC+13", "Etc/GMT-13" },{ L"UTC", "Etc/UTC" },{ L"West Bank Standard Time", "Asia/Hebron" },{ L"W. Mongolia Standard Time", "Asia/Hovd" },{ NULL, "" }};#define WIN32_LEAN_AND_MEAN 1#include <windows.h>#include <wchar.h>#include <stdlib.h> /* for wcstombs *//* #define DEBUG */#ifdef DEBUG# include <stdio.h>#endifextern void Rf_warning(const char *, ...);/* Since the registry entries can be localized and we might not berunning in the native charset, use Unicode here. */static wchar_t basekey[] =L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones\\";static char tzikey[] ="SYSTEM\\CurrentControlSet\\Control\\TimeZoneInformation";static const char *reg2Olson(const wchar_t *s){int i;LONG rc;HKEY hkey;DWORD type, size;BYTE regdata[1000]; /* 64 was not enough on Vista *//* Try for English names first */for (i = 0; TZtable[i].reg; i++)if (!wcscmp(s, TZtable[i].reg)) return TZtable[i].Olson;/* On Vista, the English name of the current timezone is in the registry *//* NOTE: this function is only called with "s" being the Windows _current_time zone. */if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, tzikey, 0, KEY_QUERY_VALUE, &hkey)== ERROR_SUCCESS) {size = 1000;rc = RegQueryValueExW(hkey, L"TimeZoneKeyName", NULL, &type,regdata, &size);RegCloseKey(hkey);if(rc == ERROR_SUCCESS) {for (i = 0; TZtable[i].reg; i++)if (!wcscmp((wchar_t *) regdata, TZtable[i].reg))return TZtable[i].Olson;}}{wchar_t keyname[100];/* That failed, so we are not on English Windows, nor onVista, probably. However, the registry time zone key namesare in English and a subset of the above list (and need tobe for use to identify an Olson name). So try them all fora match to StandardName.*/for (i = 0; TZtable[i].reg; i++) {/* RetrieveHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\TZtable[i].reg\Std*/wcscpy(keyname, basekey);wcscat(keyname, TZtable[i].reg);rc = RegOpenKeyExW(HKEY_LOCAL_MACHINE, keyname, 0,KEY_QUERY_VALUE, &hkey);if (rc != ERROR_SUCCESS) continue;size = 1000;rc = RegQueryValueExW(hkey, L"Std", NULL, &type, regdata, &size);RegCloseKey(hkey);if (rc != ERROR_SUCCESS) continue;if (!wcscmp(s, (wchar_t *) regdata)) return TZtable[i].Olson;}}Rf_warning("unable to identify current timezone '%s':\nplease set environment variable 'TZ'", s);return "unknown";}static TIME_ZONE_INFORMATION tzi;/* Longest currently (2023-01) is 32 bytes (always ASCII) */static char StandardName[64], DaylightName[64], Olson[64] = "";/* Uwe Ligges says these entries are localized in the Windows' base language */const char *getTZinfo(void){if(!Olson[0]) {const char *p = getenv("TZ");if(p) {strncpy(Olson, p, 63);Olson[63] = '\0';} else {#ifdef USE_ICU/* ICU 72 requires this function (and other from Windows 7) */if (GetProcAddress(GetModuleHandle(TEXT("kernel32")),"ResolveLocaleName")) {wchar_t zone[64];UErrorCode status = U_ZERO_ERROR;ucal_getDefaultTimeZone(zone, 64, &status);if (U_SUCCESS(status) && wcscmp(zone, L"Etc/Unknown")) {wcstombs(Olson, zone, 64);Olson[63] = '\0';# ifdef DEBUGprintf("TZ = %s\n", Olson);# endifreturn Olson;}}#endifGetTimeZoneInformation(&tzi);wcstombs(StandardName, tzi.StandardName, 64);wcstombs(DaylightName, tzi.DaylightName, 64);strncpy(Olson, reg2Olson(tzi.StandardName), 63);Olson[63] = '\0';}#ifdef DEBUGprintf("names %s, %s\n", StandardName, DaylightName);printf("TZ = %s\n", Olson);#endif}return Olson;}