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

2007-08-26 Thread Dieter Maurer
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()

2007-08-25 Thread Andreas Jung



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

2007-08-25 Thread Jonathan


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