Edit report at http://bugs.php.net/bug.php?id=33957&edit=1
ID: 33957
Comment by: wps at wwe dot com
Reported by: paul at stunning-stuff dot com
Summary: gmdate('W')/date('W') sometimes returns wrong week
number.
Status: Closed
Type: Bug
Package: Date/time related
Operating System: *
PHP Version: 5CVS-2005-08-02
Assigned To: derick
New Comment:
date('W', $timestamp) fails to return "01" for some January 1st years on
PHP version 5.3.2 and 5.2.8 on CentOS and Windows.
$year = 1970;
$month = 1;
$day = 1;
while ($year <= 2028) {
$timestamp = mktime(12, 0, 0, $month, $day, $year);
print $year . " :: " . date('W', $timestamp). " :: " . date('D',
$timestamp) . "\n</br>";
$year++;
}
Expect 01 for every year
but instead get
1970 :: 01 :: Thu
1971 :: 53 :: Fri
1972 :: 52 :: Sat
1973 :: 01 :: Mon
1974 :: 01 :: Tue
1975 :: 01 :: Wed
1976 :: 01 :: Thu
1977 :: 53 :: Sat
1978 :: 52 :: Sun
...
2020 :: 01 :: Wed
2021 :: 53 :: Fri
2022 :: 52 :: Sat
2023 :: 52 :: Sun
2024 :: 01 :: Mon
2025 :: 01 :: Wed
2026 :: 01 :: Thu
2027 :: 53 :: Fri
2028 :: 52 :: Sat
1st falling on Friday returns 53
1st falling on Saturday/Sunday return 52
Checked dates using
http://www.tuxgraphics.org/toolbox/cal_year.html
Warwick Shaw
Previous Comments:
------------------------------------------------------------------------
[2005-08-31 16:31:52] [email protected]
This bug has been fixed in CVS.
Snapshots of the sources are packaged every three hours; this change
will be in the next snapshot. You can grab the snapshot at
http://snaps.php.net/.
Thank you for the report, and for helping us make PHP better.
------------------------------------------------------------------------
[2005-08-02 16:45:08] paul at stunning-stuff dot com
Thanks for your quick reply and thanks for doing such a great job on
PHP. You dev's really make this the best open source language today.
I hope you are able to solve this problem (I'm sure you will). One more
note though: This problem should reoccur every 28 years before and after
1992. This might help you in your testing.
Thanks,
Paul van der Maas
---
www.stunning-stuff.com
------------------------------------------------------------------------
[2005-08-02 16:22:09] [email protected]
Indeed a bug, will have a look at it - thanks for the reproducable case.
------------------------------------------------------------------------
[2005-08-02 16:19:09] paul at stunning-stuff dot com
Here is some example code to reproduce the problem:
<?php
$timestamp = gmmktime(12, 0, 0, 12, 28, 1992);
echo 'Week number for ' . gmdate('D M d, Y H:i:s', $timestamp) . ': ' .
gmdate('W', $timestamp) . '<br>';
$timestamp = gmmktime(12, 0, 0, 12, 29, 1992);
echo 'Week number for ' . gmdate('D M d, Y H:i:s', $timestamp) . ': ' .
gmdate('W', $timestamp) . '<br>';
$timestamp = gmmktime(12, 0, 0, 12, 30, 1992);
echo 'Week number for ' . gmdate('D M d, Y H:i:s', $timestamp) . ': ' .
gmdate('W', $timestamp) . '<br>';
$timestamp = gmmktime(12, 0, 0, 12, 31, 1992);
echo 'Week number for ' . gmdate('D M d, Y H:i:s', $timestamp) . ': ' .
gmdate('W', $timestamp) . '<br>';
$timestamp = gmmktime(12, 0, 0, 12, 28, 2020);
echo 'Week number for ' . gmdate('D M d, Y H:i:s', $timestamp) . ': ' .
gmdate('W', $timestamp) . '<br>';
$timestamp = gmmktime(12, 0, 0, 12, 29, 2020);
echo 'Week number for ' . gmdate('D M d, Y H:i:s', $timestamp) . ': ' .
gmdate('W', $timestamp) . '<br>';
$timestamp = gmmktime(12, 0, 0, 12, 30, 2020);
echo 'Week number for ' . gmdate('D M d, Y H:i:s', $timestamp) . ': ' .
gmdate('W', $timestamp) . '<br>';
$timestamp = gmmktime(12, 0, 0, 12, 31, 2020);
echo 'Week number for ' . gmdate('D M d, Y H:i:s', $timestamp) . ': ' .
gmdate('W', $timestamp) . '<br>';
?>
Expected result:
Week number for Mon Dec 28, 1992 12:00:00: 53
Week number for Tue Dec 29, 1992 12:00:00: 53
Week number for Wed Dec 30, 1992 12:00:00: 53
Week number for Thu Dec 31, 1992 12:00:00: 53
Week number for Mon Dec 28, 2020 12:00:00: 53
Week number for Tue Dec 29, 2020 12:00:00: 53
Week number for Wed Dec 30, 2020 12:00:00: 53
Week number for Thu Dec 31, 2020 12:00:00: 53
Actual result:
Week number for Mon Dec 28, 1992 12:00:00: 1
Week number for Tue Dec 29, 1992 12:00:00: 1
Week number for Wed Dec 30, 1992 12:00:00: 1
Week number for Thu Dec 31, 1992 12:00:00: 1
Week number for Mon Dec 28, 2020 12:00:00: 1
Week number for Tue Dec 29, 2020 12:00:00: 1
Week number for Wed Dec 30, 2020 12:00:00: 1
Week number for Thu Dec 31, 2020 12:00:00: 1
Check
http://www.timeanddate.com/calendar/custom.html?year=1992&month=12&typ=1&display=1&wno=1
and
http://www.timeanddate.com/calendar/custom.html?year=2020&month=12&typ=1&display=1&wno=1
to see these expected results confirmed.
Sorry for the bulky post, but this way there is no room for
misinterpretation.
Thanks,
Paul van der Maas
---
www.stunning-stuff.com
------------------------------------------------------------------------
[2005-08-02 03:27:51] paul at stunning-stuff dot com
Description:
------------
Hi,
While I was writing my own getWeekNumber method I discovered gmdate('W')
and date('W') both return incorrect results for the year 1992 and 2020.
Both years end on a thursday and both are leap years. I'm guessing that
this is exactly the reason they return incorrect results :).
Expected result:
The last 4 days in 1992 and 2020 belong to week 53 of those years
according to ISO 8601 rules.
Actual result:
gmdate('W') and date('W') think the last 4 days of 1992 and 2020 belong
to week 1 of the following year.
I only had the time to test these two years, but I expect that PHP will
return the incorrect week number for every leap year that ends with a
thursday.
Thanks,
Paul van der Maas
---
www.stunning-stuff.com
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/bug.php?id=33957&edit=1