Bug 5781 – std.datetime: On Windows, times off by one hour in some years due to DST rule changes

Status
RESOLVED
Resolution
FIXED
Severity
normal
Priority
P2
Component
phobos
Product
D
Version
D2
Platform
All
OS
Windows
Creation time
2011-03-23T23:26:00Z
Last change time
2015-06-09T05:15:22Z
Assigned to
nobody
Creator
issues.dlang

Comments

Comment #0 by issues.dlang — 2011-03-23T23:26:10Z
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.
Comment #1 by issues.dlang — 2011-04-19T00:03:49Z
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
Comment #2 by issues.dlang — 2011-05-05T01:24:51Z