使用Windows注册表寻找下一个“夏令时”

时间:2017-07-07 11:48:43

标签: c++ timezone borland-c++

使用Windows注册表查找下一个“夏令时”。

我必须使用旧版本的Borland C ++。

来自Daylight Saving Time change with an absolute date的想法

注册表中的“W. Europe Standard Time”表示“夏令时”发生在3月的第5次发生,这是假的,因为它是第4次发生。 MSDN doc

所以当我在做的时候:

void findDate(int year, SYSTEMTIME systemTime)
{
    struct tm timestr;
    int occ = 0;
    bool found = false;

    timestr.tm_year = year - 1900;
    timestr.tm_mon = systemTime.wMonth - 1;
    timestr.tm_mday = 0;
    timestr.tm_hour = systemTime.wHour;
    timestr.tm_min = systemTime.wMinute;
    timestr.tm_sec = systemTime.wSecond;
    timestr.tm_isdst = 0;

    while((timestr.tm_mday <= 31 && !found)) {
        timestr.tm_mday += 1;
        time_t standard = mktime(&timestr);
        struct tm * temp = localtime(&standard);
        if(temp->tm_wday == systemTime.wDayOfWeek) {
           occ++;
        }

        if(occ >= sysemTime.wDay) {
             found = true;
             printf("\n\nFound: %s", asctime( &timestr ));
        }
    }
}

int main(int argc, char* argv[])
{
 // Get the timezone info.
 TIME_ZONE_INFORMATION TimeZoneInfo;
 GetTimeZoneInformation( &TimeZoneInfo );
 DYNAMIC_TIME_ZONE_INFORMATION TimeZoneInfoDyn;

 printf("\n\nStandardDate %d wDay%d wDayOfWeek%d %d %d %d", TimeZoneInfo.StandardDate.wMonth, TimeZoneInfo.StandardDate.wDay, TimeZoneInfo.StandardDate.wDayOfWeek, TimeZoneInfo.StandardDate.wHour, TimeZoneInfo.StandardDate.wMinute, TimeZoneInfo.StandardDate.wSecond);
 printf("\nDaylightDate %d wDay%d wDayOfWeek%d %d %d %d", TimeZoneInfo.DaylightDate.wMonth, TimeZoneInfo.DaylightDate.wDay, TimeZoneInfo.DaylightDate.wDayOfWeek, TimeZoneInfo.DaylightDate.wHour, TimeZoneInfo.DaylightDate.wMinute, TimeZoneInfo.DaylightDate.wSecond);

 findDate(2017, TimeZoneInfo.StandardDate);
 findDate(2018, TimeZoneInfo.DaylightDate);
 getchar();
 return 0;

}

显示:

Found: Sun Oct 29 03:00:00 2017
Found: Sun Apr 01 03:00:00 2018

而不是:

Found: Sun Oct 29 03:00:00 2017
Found: Sun Mar 25 03:00:00 2018

我做错了什么?

1 个答案:

答案 0 :(得分:2)

  

&#34; W。欧洲标准时间&#34;在注册表示,&#34;夏令时&#34;发生在3月的星期日的第5次发生,这是错误的,因为它是第4次出现。

从链接答案中引用的文档:

  

(1到5,其中5表示如果一周的那一天没有发生5次,则在月内最后一次出现)。

所以这不是假的。

此外,在您的循环中,您需要在之前增加tm_mdayocc ,以检查您是否已达到所需的日期。如果你开始使用它,你就会超调。

顺便说一下,sysemTime拼错了。