Dieter Maurer <[EMAIL PROTECTED]> writes: > > Eric Thomas wrote at 2007-8-25 07:18 -0500: > >I've been having a site problem that I've tracked down to DateTime. Simply > >enough, the code snippets below both try to add 31 days to the first day in > >October. I'm expecting this to result in the first day of November. > > > >Good Example: > > > >>>> from DateTime import DateTime > >>>> start=DateTime('2005/10/01 01:00:00 GMT-5') > >>>> print start > >2005/10/01 01:00:00 GMT-5 > >>>> earlyStart=start.earliestTime() > >>>> print earlyStart > >2005/10/01 > >>>> print earlyStart+31 > >2005/11/01 > > > >Bad Example: (Here's the problem) > > > >>>> from DateTime import DateTime > >>>> start=DateTime('2005/10/01 01:00:00 US/Central') > >>>> print start > >2005/10/01 01:00:00 US/Central > >>>> earlyStart=start.earliestTime() > >>>> print earlyStart > >2005/10/01 > >>>> print earlyStart+31 > >2005/10/31 23:00:00 US/Central > > > >I've confirmed this occurs with several of the US/ timezones (US/Pacific, > >US/Alaska, etc) > > This looks like a daytime saving problem: > > With daytime saving, the clock often is put back for an hour > at the last samday in october.... > > The "DateTime" implementation could avoid this > *if* the arithmetic would only accept > "int" (then it would be very likely that you only want to modify > the day but not hours, minutes and seconds). But the arithmetic > accepts "float" and that necessitates some surprises with > time discontinuities (such as daytime saving switches). > > > > >Can anyone help me figure out why the resulting date is coming up 1 hour > >short of the expected 2005/11/01 ? > > > >Thanks! > > > >Eric I've submitted this as a zope bug and I agree that it looks like a daytime saving problem. The problem was tiggered nightly by a Google bot hitting various dates on my site's calendar.
Even more interesting is that the seconds, milliseconds, and timezone stored within the DateTime are correct after the addition. So, if I compare the two results from the examples I gave using DateTime.isEqualTo(), the answer is True. This really creates a lot of opportunity for error. To work around this, I've modified the addition so that instead of adding 1 day, it adds 1.5 days. This extra half a day is removed by the theDateTime.earliestTime() call but is enough to overcome the DST addition problem. Ugly hack. Thanks all. - Eric _______________________________________________ Zope maillist - Zope@zope.org http://mail.zope.org/mailman/listinfo/zope ** No cross posts or HTML encoding! ** (Related lists - http://mail.zope.org/mailman/listinfo/zope-announce http://mail.zope.org/mailman/listinfo/zope-dev )