Portabel kann man aber Zeitzonen nicht ändern, da braucht man tzset (und putenv).
Ich habs mal versucht, da M$ aber wieder mal eigene Wege geht, etwas umständlich, bessere Lösungen sind willkommen:
http://ideone.com/fCXJxf
#include <stdio.h>
#include <time.h>
struct tm makeDate(int day, int month, int year)
{
struct tm ttm = { 0 };
ttm.tm_mday = day;
ttm.tm_mon = month - 1;
ttm.tm_year = year - 1900;
return ttm;
}
int main()
{
struct tm date,
startDate = makeDate(1, 1, 2016),
endDate = makeDate(31, 12, 2016);
time_t end = mktime(&endDate);
#ifdef __int64 /* VisualC+MinGW */
#else
extern char *tzname[2]; /* Linux/POSIX */
extern long timezone;
extern int daylight;
putenv("TZ=CET-1CEST,M3.5.0/2,M10.5.0/3");
#endif
tzset(); printf("%d %ld %s %s\n", daylight, timezone, tzname[0], tzname[1]);
for (date = startDate; end >= mktime(&date); ++date.tm_mday)
{
printf("%d %s", date.tm_isdst, asctime(&date)); /* Berlin */
}
putenv("TZ=EST5EDT,M3.2.0/2,M11.1.0");
tzset(); printf("%d %ld %s %s\n", daylight, timezone, tzname[0], tzname[1]);
for (date = startDate; end >= mktime(&date); ++date.tm_mday)
{
printf("%d %s", date.tm_isdst, asctime(&date)); /* New York */
}
return 0;
}