[Zope] Re: Help with DateTime.earliestTime()

Eric eric at thomasfam.com
Sun Aug 26 15:12:18 EDT 2007


Dieter Maurer <dieter at ...> 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





More information about the Zope mailing list