[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 ? Thanks! 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 )
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: 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 )
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 >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 >start2005/10/01 01:00:00 GMT-5>>> >earlyStart=start.earliestTime() print earlyStart2005/10/01>>> print >earlyStart+312005/11/01 > >Bad Example: (Here's the problem) from DateTime import DateTime>>> >start=DateTime('2005/10/01 01:00:00 US/Central')>>> print >start2005/10/01 01:00:00 US/Central>>> >earlyStart=start.earliestTime >()>>> print earlyStart2005/10/01>>> print >earlyStart+312005/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 ? >Thanks! >Eric > > -- 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 )