----- Original Message ----- From: "Eric Thomas" <[EMAIL PROTECTED]>
To: <zope@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


_______________________________________________
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 )

Reply via email to