Thread overview
[Issue 5781] New: std.datetime: On Windows, times off by one hour in some years due to DST rule changes
Mar 24, 2011
Jonathan M Davis
Apr 19, 2011
Jonathan M Davis
Apr 19, 2011
Jonathan M Davis
May 05, 2011
Jonathan M Davis
March 24, 2011
http://d.puremagic.com/issues/show_bug.cgi?id=5781

           Summary: std.datetime: On Windows, times off by one hour in
                    some years due to DST rule changes
           Product: D
           Version: unspecified
          Platform: All
        OS/Version: Windows
            Status: NEW
          Severity: normal
          Priority: P2
         Component: Phobos
        AssignedTo: nobody@puremagic.com
        ReportedBy: jmdavisProg@gmx.com


--- Comment #0 from Jonathan M Davis <jmdavisProg@gmx.com> 2011-03-23 23:26:10 PDT ---
If are on Windows 7 in one of most of the time zones in America, this lovely little program

import std.datetime;
import std.stdio;

void main()
{
    writeln(SysTime(Date(1999, 3, 1)));
    writeln(SysTime(Date(1999, 3, 8)));
    writeln(SysTime(Date(1999, 3, 14)));
    writeln(SysTime(DateTime(1999, 3, 14, 1, 0, 0)));
    writeln(SysTime(DateTime(1999, 3, 14, 2, 0, 0)));
    writeln(SysTime(DateTime(1999, 3, 14, 3, 0, 0)));
    writeln(SysTime(Date(1999, 3, 15)));
    writeln(SysTime(Date(1999, 3, 22)));
    writeln(SysTime(Date(1999, 3, 29)));
    writeln(SysTime(Date(1999, 4, 1)));
    writeln(SysTime(Date(1999, 4, 3)));
    writeln(SysTime(DateTime(1999, 4, 4, 1, 0, 0)));
    writeln(SysTime(DateTime(1999, 4, 4, 2, 0, 0)));
    writeln(SysTime(DateTime(1999, 4, 4, 3, 0, 0)));
    writeln(SysTime(Date(1999, 4, 5)));
}

results in this output:

1999-Mar-01 00:00:00
1999-Mar-08 00:00:00
1999-Mar-14 00:00:00
1999-Mar-14 01:00:00
1999-Mar-14 01:00:00
1999-Mar-14 02:00:00
1999-Mar-14 23:00:00
1999-Mar-21 23:00:00
1999-Mar-28 23:00:00
1999-Mar-31 23:00:00
1999-Apr-02 23:00:00
1999-Apr-04 00:00:00
1999-Apr-04 01:00:00
1999-Apr-04 03:00:00
1999-Apr-05 00:00:00

The DST rules changed in most of North America in 2007. This bug occurs in any year prior to 2007 for time zones in North America which had their DST rules changed in 2007. It likely similarly affects other time zones whose DST rules changed at some point. I don't know if this affects versions of Windows prior to 7. I would be surprised if it didn't affect Vista, but I suspect that it doesn't affect XP (it might though). DYNAMIC_TIME_ZONE_INFORMATION was added with Windows Vista, and I suspect that that is what is being used under the hood in 7. And if that is the case, then XP likely has different behavior. And I can't use DYNAMIC_TIME_ZONE_INFORMATION in Phobos, since we can't assume that Windows programmers are using Vista or newer and do not want to compile for XP.

Essentially, it has to do with the fact that in Windows 7, the Windows' function SystemTimeToTzSpecificLocalTime doesn't really use the TIME_ZONE_INFORMATION struct that it's given. Instead, it looks up the correct time zone rules for the year in question. Wine does _not_ have this behavior, and I did most of my Windows testing for std.datetime testing in Wine (I'm now using VirtualBox with a Windows 7 install in it, which is a much better solution overall, so that shouldn't be a problem in the future).

I'm not quite sure what the best fix for this is, but I'll sort it out and fix it fairly soon. In the meantime, here's a bug report so that it's clear that the bug exists, and it'll be clear when it's fixed. And if you have a Windows XP or Vista box and are in the Pacific, Mountain, or Eastern time zones, I'd appreciate it if you could run the above code and add the results to this bug so that I know if XP and/or Vista have the same behavior.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
April 19, 2011
http://d.puremagic.com/issues/show_bug.cgi?id=5781


Jonathan M Davis <jmdavisProg@gmx.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |ASSIGNED


-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
April 19, 2011
http://d.puremagic.com/issues/show_bug.cgi?id=5781



--- Comment #1 from Jonathan M Davis <jmdavisProg@gmx.com> 2011-04-19 00:03:49 PDT ---
No pull request yet, but the fix for this bug is in a branch of my github repository:

https://github.com/jmdavis/phobos/tree/datetime

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
May 05, 2011
http://d.puremagic.com/issues/show_bug.cgi?id=5781


Jonathan M Davis <jmdavisProg@gmx.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|ASSIGNED                    |RESOLVED
         Resolution|                            |FIXED


--- Comment #2 from Jonathan M Davis <jmdavisProg@gmx.com> 2011-05-05 01:24:51 PDT ---
Fixed: https://github.com/D-Programming-Language/phobos/commit/ac392c58be85ba6173c3aadff4405901a4046a2c#std/datetime.d

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------