go to bug id or search bugs for
When we reach negative years 'date()' calulates the day of the week 'N' incorrectly.
Apparently one day too much is subtracted in this case.
So that for example the date '-1-W52-3' is displayed as '-1-W52-2' instead, when using 'date()'.
The issue can be easily reproduced here:
$time=-62167046400; // 0000-01-03 0-01-1
var_dump(date('Y-m-d o-W-N', $time - 86400));
var_dump(date('Y-m-d o-W-N', $time - 86400 * 2));
var_dump(date('Y-m-d o-W-N', $time - 86400 * 3), 'The issue appeared here. Expected: 0000-01-02 -1-52-5');
var_dump(date('Y-m-d o-W-N', $time - 86400 * 4));
var_dump(date('Y-m-d o-W-N', $time - 86400 * 5));
The date should be formatted correctly and the displayed weekday should match the actual weekday for a timestamp.
The date is formatted incorrectly and the displayed weekday, for negative years, is one less than the actual weekday.
Add a Patch
Add a Pull Request
From the date page http://php.net/manual/en/function.date.php :
The valid range of a timestamp is typically from Fri, 13 Dec 1901 20:45:54 GMT to Tue, 19 Jan 2038 03:14:07 GMT. (These are the dates that correspond to the minimum and maximum values for a 32-bit signed integer). However, before PHP 5.1.0 this range was limited from 01-01-1970 to 19-01-2038 on some systems (e.g. Windows).
You may need to use a more specific library to cope with BCE dates, and to do things like deal with the Julian to Gregorian calendar changes.