[Zope] y2kbug - bobobase_modification_time one day back

Wolfgang Strobl ws@mystrobl.de
Thu, 2 Mar 2000 23:23:00 +0100


This ist a typical Y2K bug, located in the module TimpeStamp.c, 
as I suspected earlier.
 
Since nobody followed my hint from earlier this day so far, I took 
the opportunity to dig a little deeper, learning how to build and 
replace a python extension on the way.

Given how little documentation there is, I don't claim having 
understood anything about, but noticing that the function

static double TimeStamp_abst(int y, int mo, int d, int m, int s)

gets called with y=100 (not 2000), 

changing the leap yar calculation

 l = y%4==0 && (y%100 != 0 || y%400==0);

to

 l = y%4==0 && (y%100 != 0 || (y+1900)%400==0);

in that function fixed the problem on my system.


DTML Document at /y2k / t 

<dtml-var standard_html_header>
<h2><dtml-var title_or_id></h2>
<p>
This is the <dtml-var id> Document.
</p>
<dtml-var "bobobase_modification_time()"><br>
<dtml-var "_.DateTime()">
<dtml-var standard_html_footer>

renders as

This is the t Document. 
2000/03/02 23:13:8.393 GMT+1
2000/03/02 23:13:54.619 GMT+1 

now.

The complete function from ZODB/TimeStamp.c in context:

--------------------------------------------------------

static double
TimeStamp_abst(int y, int mo, int d, int m, int s)
{
  int l;
  l = y%4==0 && (y%100 != 0 || (y+1900)%400==0);  // y2kfix ws 
2000-03-02
// was   l = y%4==0 && (y%100 != 0 || y%400==0);
  return (TimeStamp_yad(y)+ joff[l][mo]+d)*86400 + m*60 + s;
}

--------------------------------------------------------

Hope this hilft. :-}

-- 
Wolfgang Strobl