Day 328
A trifle bizarre. After a bunch of investigation, I eventually narrowed down a synchronization problem to the following mini test program:
When I ran on Mac OS X:#include <time.h> #include <stdio.h> int main() { time_t tv = time(NULL); struct tm *tms = localtime(&tv); printf("%02d:%02d:%02d DST:%d\n", tms->tm_hour, tms->tm_min, tms->tm_sec, tms->tm_isdst); }
But when I ran on my main Windows XP box:~:date Mon Mar 27 14:12:29 BST 2006 ~:a.out 14:12:30 DST:1
Now, I'm usually happy to believe the worst of Microsoft, but it stretches even my credibility to think that their C runtime doesn't get the 1989 ANSI standard right (particularly as a quick web search didn't turn up any complaints).c:\>time /t 14:13 c:\>localtime.exe 13:13:03 DST:0
Investigating further, when I ran the same code on a different Windows XP machine, I get the right answer:
c:\>time /t 14:15 c:\>localtime.exe 14:15:24 DST:0
So I checked MSDN and found some mutterings about "localtime corrects for the local time zone if the user first sets the global environment variable TZ...TZ is a Microsoft extension and not part of the ANSI standard definition of localtime. Note: The target environment should try to determine whether daylight saving time is in effect."
Running echo %TZ%
from the command line showed up as GMT
. So I tried
changing the timezone to EST, but echo %TZ%
was still reading GMT
. Odd.
Eventually, I discovered that my login had TZ=GMT
hard-coded into the environment (Control Panel,
System, Advanced, Environment Variables). Not sure how it got that way, but finding it and making it not so
has just taken a couple of hours.
[A:35029 B:3218 C:346 D:9187 Total:47780]
No comments:
Post a Comment