From: Lloyd Zusman Date: 2006-01-30T19:03:41+09:00 Subject: Re: is it Time bug? Pat Maddox writes: > First of all for doing stuff like this I highly recommend checking out > Runt [1], it's a temporal expression library. Think regular > expressions for time. > > Anyway I think it has to do with the fact that that the Date lib > accounts for leap years, but your code doesn't. To explain it a bit.. > > There are 365.25 days in a year, not 365. This means that there are > 31557600 seconds in a year, rather than the 31536000 that your code > would generate. That leaves you with 21600 unnoticed seconds. 365 / > 21600 = 0.0168981481, which is how many seconds are lost in each day. > There are 63 days between your start date of Sep 01 and the "weird" > date of Nov 02. 63 * 0.0168981481 = 1.03, so there's one lost second, > causing the day to not roll over. > > Pretty fun, huh? :) I don't believe that this is the cause of the problem here. Changing the dates from 5/1/2005 to 7/11/2005 (just shifting everything back 4 months) does not cause the same effect. This is a daylight savings time issue, not a seconds-per-year issue. In 2005, daylight savings time went into effect on April 3, 2005, and terminated on 30 October, 2005 ... at least in the USA. t1 = Time.mktime(2005, 5, 1) t2 = Time.mktime(2005, 7, 11) while t1.to_i < t2.to_i p t1 t1 += 3600*24*7 end Sun May 01 00:00:00 EDT 2005 Sun May 08 00:00:00 EDT 2005 Sun May 15 00:00:00 EDT 2005 Sun May 22 00:00:00 EDT 2005 Sun May 29 00:00:00 EDT 2005 Sun Jun 05 00:00:00 EDT 2005 Sun Jun 12 00:00:00 EDT 2005 Sun Jun 19 00:00:00 EDT 2005 Sun Jun 26 00:00:00 EDT 2005 Sun Jul 03 00:00:00 EDT 2005 Sun Jul 10 00:00:00 EDT 2005 Every day has exactly 86400 seconds (except every few years when a leap-second is added/subtracted). The seconds-per-year issue is covered by leap years. -- Lloyd Zusman ljz@asfast.com God bless you.