I found the origin of this problem, and it is not ZcDate class, but the way it is used. It is generally called like this:
PHP Code:
$zcDate->output('%b', mktime(0, 0, 0, $i)));
Where $i is the month number. Day and year are not given as parameter which means the actual date day and year are used.
Problem is when actual date day is higher than the last day of a month. For PHP it is next month, like 30th of February is actually 2nd of March.
This bug only appears at the end of the month, from 29 to 31! The 31th of the month is worse case where all month less than 31 days (Feb., April, June,Sept. and Nov.) will be set to next month...
Solution is to call zcDate class output like this:
PHP Code:
$zcDate->output('%b', mktime(0, 0, 0, $i,1)));
There might be other places in ZC where this needs to be modified...
For this plugin, file paypalr.php needs to be modified on lines 782 and 1269. Line 874 might need it too, not sure yet.