Leap seconds and mx.DateTime
Christian Marquardt <[email protected]> Thu, 5 Jan 2012 01:25:46 +0100 (CET)
| Newsgroups | gmane.comp.python.egenix.user |
|---|---|
| Message-ID | <3694925.104.1325723146738.JavaMail.root@athene> |
Hello, on another topic - a while ago, we discovered a small inconsistency in the handling of leap seconds in mx.DateTime; some checks assume that a day is not longer than 86400 seconds, although of course on a day with a leap second this would be 86401 seconds. I've attached a patch (against the 3.2.2 dev version from another discussion thread) that has fixed the issue for us; maybe it or an improved version could make it's way into one of the next releases... Thanks a lot, Christian. _______________________________________________________________________ eGenix.com User Mailing List http://www.egenix.com/ https://www.egenix.com/mailman/listinfo/egenix-users
egenix-mx-base-3.2.2-leapsecondrange.patch
(text/x-patch, 2.4 KB)
diff -r -C3 egenix-mx-base-3.2.2_dev_20120103.orig/mx/DateTime/mxDateTime/mxDateTime.c egenix-mx-base-3.2.2_dev_20120103/mx/DateTime/mxDateTime/mxDateTime.c
*** egenix-mx-base-3.2.2_dev_20120103.orig/mx/DateTime/mxDateTime/mxDateTime.c 2012-01-03 19:57:19.000000000 +0100
--- egenix-mx-base-3.2.2_dev_20120103/mx/DateTime/mxDateTime/mxDateTime.c 2012-01-05 01:05:34.918070159 +0100
***************
*** 1161,1167 ****
/* Special case for leap seconds */
hour = 23;
minute = 59;
! second = 60.0;
}
else {
hour = inttime / 3600;
--- 1161,1167 ----
/* Special case for leap seconds */
hour = 23;
minute = 59;
! second = 60.0 + abstime - (int) abstime;
}
else {
hour = inttime / 3600;
***************
*** 1290,1298 ****
(int)abstime);
/* Bounds check */
! Py_AssertWithArg(abstime >= 0.0 && abstime <= SECONDS_PER_DAY,
mxDateTime_RangeError,
! "abstime out of range (0.0 - 86400.0): %f",
abstime);
datetime->absdate = absdate;
--- 1290,1298 ----
(int)abstime);
/* Bounds check */
! Py_AssertWithArg(abstime >= 0.0 && abstime < SECONDS_PER_DAY + (double) 1.0,
mxDateTime_RangeError,
! "abstime out of range (0.0 - 86401.0): %f",
abstime);
datetime->absdate = absdate;
diff -r -C3 egenix-mx-base-3.2.2_dev_20120103.orig/mx/DateTime/mxDateTime/mxDateTime_Python.py egenix-mx-base-3.2.2_dev_20120103/mx/DateTime/mxDateTime/mxDateTime_Python.py
*** egenix-mx-base-3.2.2_dev_20120103.orig/mx/DateTime/mxDateTime/mxDateTime_Python.py 2001-06-24 15:54:29.000000000 +0200
--- egenix-mx-base-3.2.2_dev_20120103/mx/DateTime/mxDateTime/mxDateTime_Python.py 2012-01-05 01:05:34.919070169 +0100
***************
*** 319,326 ****
if abstime < 0 and abstime > -0.001: abstime = 0.0
if not (absdate > 0):
raise RangeError, "absdate out of range (>0)"
! if not (abstime >= 0.0 and abstime <= 86400.0):
! raise RangeError, "abstime out of range (0.0 - 86400.0) <%s>" % abstime
dt.absdate=absdate
dt.abstime=abstime
--- 319,326 ----
if abstime < 0 and abstime > -0.001: abstime = 0.0
if not (absdate > 0):
raise RangeError, "absdate out of range (>0)"
! if not (abstime >= 0.0 and abstime < 86401.0):
! raise RangeError, "abstime out of range (0.0 - 86401.0) <%s>" % abstime
dt.absdate=absdate
dt.abstime=abstime