[Zope] Help with DateTime.earliestTime()

Jonathan dev101 at magma.ca
Sat Aug 25 08:38:33 EDT 2007


----- Original Message ----- 
From: "Eric Thomas" <eric at thomasfam.com>
To: <zope at zope.org>
Sent: Saturday, August 25, 2007 8:18 AM
Subject: [Zope] Help with DateTime.earliestTime()


> 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)
>
> Can anyone help me figure out why the resulting date is coming up 1 hour
> short of the expected 2005/11/01 ?

I don't know what your problem is, but here are some code snippets I used to 
get around a timezone problem I was having:

# def custom timezone class
class LocalTimezone(datetime.tzinfo):
        def utcoffset(self, dt):
                STDOFFSET = datetime.timedelta(seconds = -_time.timezone)
                ZERO = datetime.timedelta(0)
                if _time.daylight:
                        DSTOFFSET = datetime.timedelta(seconds 
= -_time.altzone)
                else:
                        DSTOFFSET = STDOFFSET
                if self._isdst(dt):
                        return DSTOFFSET
                else:
                        return STDOFFSET

        def dst(self, dt):
                STDOFFSET = datetime.timedelta(seconds = -_time.timezone)
                ZERO = datetime.timedelta(0)
                if _time.daylight:
                        DSTOFFSET = datetime.timedelta(seconds 
= -_time.altzone)
                else:
                        DSTOFFSET = STDOFFSET
                if self._isdst(dt):
                        DSTDIFF = DSTOFFSET - STDOFFSET
                        return DSTDIFF
                else:
                        return ZERO

        def tzname(self, dt):
                        return _time.tzname[self._isdst(dt)]

        def _isdst(self, dt):
                tt = (dt.year, dt.month, dt.day,
                dt.hour, dt.minute, dt.second,
                dt.weekday(), 0, -1)
                stamp = _time.mktime(tt)
                tt = _time.localtime(stamp)
                return tt.tm_isdst > 0


# usage code...
        Local = LocalTimezone()
        chkDate = datetime.datetime.now(Local)
        now = datetime.datetime.now(Local)

        # see if we have to apply a local timezone offset
        if tzo:
                # get the number of hours less than UTC (GMT)
                localTZO = int(chkDate.strftime('%z')[0:-2])

                # make sure we have the target tzo as an integer
                targetTZO = int(tzo)

                diffTZO = 0
                if targetTZO < localTZO:
                        diffTZO = -(-targetTZO + localTZO)

                elif targetTZO > localTZO:
                        diffTZO = (-localTZO + targetTZO)

                if diffTZO:
                        # we have to adjust our dates to account for the 
time zone difference
                        chkDate = chkDate + 
datetime.timedelta(hours=diffTZO)
                        now = now + datetime.timedelta(hours=diffTZO)

        # create a time delta object (a date/time object that is a duration) 
for 6 months
        maxDate = datetime.timedelta(weeks=24)

        # check for events within a 6 month window
        while chkDate < now + maxDate:


This code was just ripped from an application, but may provide you with some 
ideas for a work-around.

Good luck!

Jonathan
 



More information about the Zope mailing list