fixed logic bug
[tridge/junkcode.git] / dst.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <sys/time.h>
4
5 #define DAY (24*60*60)
6 #define YEAR (365*DAY)
7
8 void get_time_diff(time_t t,int *timediff,int *is_dst)
9 {
10   struct tm tm_utc,tm_local;
11   tm_utc = *(gmtime(&t));
12   tm_local = *(localtime(&t));
13
14   *timediff = mktime(&tm_utc) - mktime(&tm_local);
15   *is_dst = tm_local.tm_isdst;
16 }
17
18 main()
19 {
20   time_t tnow = time(NULL);
21   int is_dst,timediff;
22   int last_dst,lastdiff;
23   time_t endt = tnow + 2*YEAR;
24   time_t t = tnow - 2*YEAR;
25   time_t high,low;
26   int count=0;
27
28   while (1) {
29
30     get_time_diff(t,&lastdiff,&last_dst);
31     low = t;
32
33     /* run forward till we get a change */
34     for (timediff = lastdiff, is_dst = last_dst;
35          timediff == lastdiff && last_dst == is_dst && t < endt ; 
36          t += 10*DAY)
37       get_time_diff(t,&timediff,&is_dst);
38
39     if (t >= endt) break;
40
41     high = t;
42
43     /* find the change */
44     while (low+1 < high) {
45       t = (low+high)/2;
46       get_time_diff(t,&timediff,&is_dst);
47       if (timediff == lastdiff && is_dst == last_dst) 
48         low = t;
49       else
50         high = t;
51     }
52     t = high;
53
54     get_time_diff(t,&timediff,&is_dst);
55     printf("TimeDiff=%d is_dst=%d at %s",
56            timediff,is_dst,asctime(localtime(&t)));
57     count++;
58   }
59
60   if (!count)
61     printf("No timezone or DST changes?\n");
62
63   return(0);
64 }