I need some help to finish this implementation. I don't have access to an english version of Windows NT4 or 2K or XP, so I couldn't finish the array of the timezones. COuld somebody help me a bit on this one? I'm planning on actually writing the equivalence in Unix timezones, so you only need to give me the names of the Windows timezones. I have a small program to help you if you need it. Changelog: - Improves the implementation of GetTimeZoneInformation. Missing some Windows timezone names. Vincent
diff -urN wine-orig/dlls/kernel/time.c wine-pas-compilé/dlls/kernel/time.c --- wine-orig/dlls/kernel/time.c Wed May 15 22:28:45 2002 +++ wine-pas-compilé/dlls/kernel/time.c Mon May 27 22:00:34 2002 @@ -43,14 +43,39 @@ */ struct tagTZ_INFO { - const char *psTZFromUnix; - WCHAR psTZWindows[32]; - int bias; - int dst; + const char *psTZFromUnixStandard; + const char *psTZFromUnixDaylight; + TIME_ZONE_INFORMATION tzi; }; static const struct tagTZ_INFO TZ_INFO[] = { + {"PST", "PDT", + {480, + {'P', 'a', 'c', 'i', 'f', 'i', 'c', '\0'}, + {0, 10, 0, 5, 2, 0, 0, 0}, 0, + {'P', 'a', 'c', 'i', 'f', 'i', 'c', ' ', '(', 'd', 'a', 'y', 'l', 'i', 'g', 'h', 't', ')', '\0'}, + {0, 4, 0, 1, 2, 0, 0, 0}, -60}}, + {"MST", "MDT", + {420, + {'M', 'o', 'u', 'n', 't', 'a', 'i', 'n', '\0'}, + {0, 10, 0, 5, 2, 0, 0, 0}, 0, + {'M', 'o', 'u', 'n', 't', 'a', 'i', 'n', ' ', '(', 'd', 'a', 'y', 'l', 'i', 'g', 'h', 't', ')', '\0'}, + {0, 4, 0, 1, 2, 0, 0, 0}, -60}}, + {"CST", "CDT", + {360, + {'C', 'e', 'n', 't', 'r', 'a', 'l', '\0'}, + {0, 10, 0, 5, 2, 0, 0, 0}, 0, + {'C', 'e', 'n', 't', 'r', 'a', 'l', ' ', '(', 'd', 'a', 'y', 'l', 'i', 'g', 'h', 't', ')', '\0'}, + {0, 4, 0, 1, 2, 0, 0, 0}, -60}}, + {"EST", "EDT", + {300, + {'E', 'a', 's', 't', 'e', 'r', 'n', '\0'}, + {0, 10, 0, 5, 2, 0, 0, 0}, 0, + {'E', 'a', 's', 't', 'e', 'r', 'n', ' ', '(', 'd', 'a', 'y', 'l', 'i', 'g', 'h', 't', ')', '\0'}, + {0, 4, 0, 1, 2, 0, 0, 0}, -60}} +}; +/*{ {"MHT", {'D','a','t','e','l','i','n','e',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'}, -720, 0}, @@ -243,28 +268,26 @@ {"TOT", {'T','o','n','g','a',' ','S','t','a','n','d','a','r','d',' ','T','i','m','e','\0'}, -780, 0} -}; +};*/ -/* TIME_GetTZAsStr: helper function that returns the given timezone as a string. - This could be done with a hash table instead of merely iterating through - a table, however with the small amount of entries (60 or so) I didn't think - it was worth it. */ -static const WCHAR* TIME_GetTZAsStr (time_t utc, int bias, int dst) +/* TIME_GetTZAsTZINFO: helper function that returns the given timezone as a + pointer to a TIME_ZONE_INFORMATION structure. This could be done with a + hash table instead of merely iterating through a table, however with the + small amount of entries (60 or so) I didn't think it was worth it. */ +static const TIME_ZONE_INFORMATION* TIME_GetTZAsTZINFO (time_t utc, int *pdaylight) { char psTZName[7]; struct tm *ptm = localtime(&utc); int i; + *pdaylight = -1; if (!strftime (psTZName, 7, "%Z", ptm)) return (NULL); - - for (i=0; i<(sizeof(TZ_INFO) / sizeof(struct tagTZ_INFO)); i++) - { - if ( strcmp(TZ_INFO[i].psTZFromUnix, psTZName) == 0 && - TZ_INFO[i].bias == bias && - TZ_INFO[i].dst == dst - ) - return TZ_INFO[i].psTZWindows; + *pdaylight = ptm->tm_isdst; + for (i = 0; i < (sizeof(TZ_INFO) / sizeof(struct tagTZ_INFO)); i++) { + if ( strcmp(TZ_INFO[i].psTZFromUnixStandard, psTZName) == 0 || + strcmp(TZ_INFO[i].psTZFromUnixDaylight, psTZName) == 0) + return &(TZ_INFO[i].tzi); } return (NULL); @@ -447,21 +469,32 @@ LPTIME_ZONE_INFORMATION tzinfo) /* [out] The time zone structure to be filled in. */ { time_t gmt; - int bias, daylight; - const WCHAR *psTZ; - + const TIME_ZONE_INFORMATION *ptTZI; + int daylight; memset(tzinfo, 0, sizeof(TIME_ZONE_INFORMATION)); gmt = time(NULL); - bias=TIME_GetBias(gmt,&daylight); - - tzinfo->Bias = -bias / 60; - tzinfo->StandardBias = 0; - tzinfo->DaylightBias = -60; - psTZ = TIME_GetTZAsStr (gmt, (-bias/60), daylight); - if (psTZ) strcpyW( tzinfo->StandardName, psTZ ); - return TIME_ZONE_ID_STANDARD; + ptTZI = TIME_GetTZAsTZINFO (gmt, &daylight); + if(ptTZI) { + tzinfo->Bias = ptTZI->Bias; + strcpyW(tzinfo->StandardName, ptTZI->StandardName); + memcpy(&(tzinfo->StandardDate), &(ptTZI->StandardDate), sizeof(SYSTEMTIME)); + tzinfo->StandardBias = ptTZI->StandardBias; + strcpyW(tzinfo->DaylightName, ptTZI->DaylightName); + memcpy(&(tzinfo->DaylightDate), &(ptTZI->DaylightDate), sizeof(SYSTEMTIME)); + tzinfo->DaylightBias = ptTZI->DaylightBias; + if(daylight == 0) { + return TIME_ZONE_ID_STANDARD; + } else if(daylight > 0) { + return TIME_ZONE_ID_DAYLIGHT; + } else { + return TIME_ZONE_ID_UNKNOWN; + } + } else { + SetLastError(ERROR_UNKNOWN); + return TIME_ZONE_ID_INVALID; + } }