Re: [Zope] Help with DateTime.earliestTime()
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 divI#39;ve been having a site problem that I#39;ve tracked down to DateTime.nbsp; Simply enough, the code snippets below both try to add 31 days to the first day in October.nbsp; I#39;m expecting this to result in the first day of November. /div divnbsp;/div divGood Example:/div div pgt;gt;gt; from DateTime import DateTimebrgt;gt;gt; start=DateTime(#39;2005/10/01 01:00:00 GMT-5#39;)brgt;gt;gt; print startbr2005/10/01 01:00:00 GMT-5brgt;gt;gt; earlyStart=start.earliestTime()br gt;gt;gt; print earlyStartbr2005/10/01brgt;gt;gt; print earlyStart+31br2005/11/01/p/div div pBad Example:nbsp; (Here#39;s the problem)/p pgt;gt;gt; from DateTime import DateTimebrgt;gt;gt; start=DateTime(#39;2005/10/01 01:00:00 US/Central#39;)brgt;gt;gt; print startbr2005/10/01 01:00:00 US/Centralbrgt;gt;gt; earlyStart=start.earliestTime ()brgt;gt;gt; print earlyStartbr2005/10/01brgt;gt;gt; print earlyStart+31br2005/10/31 23:00:00 US/Central/p pI#39;ve confirmed this occurs with several of the US/ timezones (US/Pacific, US/Alaska, etc)/p pCan anyone help me figure out why the resulting date is coming up 1 hour short of the expected 2005/11/01 ?/p pThanks!/p pEric/p pnbsp;/p pnbsp;/p/div -- Dieter ___ 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 )
Re: [Zope] Help with DateTime.earliestTime()
--On 25. August 2007 07:18:42 -0500 Eric Thomas [EMAIL PROTECTED] wrote: 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. Likely because the timezone support is known to be partly broken (since ages). -aj pgprmA5T8AN1C.pgp Description: PGP signature ___ 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 )
Re: [Zope] Help with DateTime.earliestTime()
- 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 )