使用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(×tr);
struct tm * temp = localtime(&standard);
if(temp->tm_wday == systemTime.wDayOfWeek) {
occ++;
}
if(occ >= sysemTime.wDay) {
found = true;
printf("\n\nFound: %s", asctime( ×tr ));
}
}
}
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
我做错了什么?
答案 0 :(得分:2)
&#34; W。欧洲标准时间&#34;在注册表示,&#34;夏令时&#34;发生在3月的星期日的第5次发生,这是错误的,因为它是第4次出现。
从链接答案中引用的文档:
(1到5,其中5表示如果一周的那一天没有发生5次,则在月内最后一次出现)。
所以这不是假的。
此外,在您的循环中,您需要在之前增加tm_mday
和occ
,以检查您是否已达到所需的日期。如果你开始使用它,你就会超调。
顺便说一下,sysemTime
拼错了。