Edit report at https://bugs.php.net/bug.php?id=65730&edit=1
ID: 65730
Comment by: glavic at gmail dot com
Reported by: glavic at gmail dot com
Summary: DateTime::format('W') returns wrong week number
Status: Not a bug
Type: Bug
Package: Date/time related
Operating System: ALL
PHP Version: Irrelevant
Block user comment: N
Private report: N
New Comment:
@rasmus: I never said nothing about first or last week of the month containing
dates from before/after year. You probably agree with statement that the last
week of the year 2013 (and first week of the year 2014) is from 2013-12-30 to
2014-01-05?
I reported this, not because what you said, but because code "echo (new
DateTime('2013-12-30'))->format('Y W');" returns "2013 01" which is incorrect,
and for me this is bug. This should, like I already said in report, return
"2014 01".
Code "echo (new DateTime('2012-12-31'))->format('Y W');" also returns "2013
01". So now we have two identical week number for year 2013 with a year
difference between dates ;)
Previous Comments:
------------------------------------------------------------------------
[2013-09-21 14:33:53] [email protected]
PHP uses the ISO 8601 standard for day, month and week numbers. This is pretty
clearly documented and if you read ISO 8601 it states that the first week of
the
year is "the week with the year's first Thursday in it" and since ISO 8601
weeks
start on Mondays, it is quite normal for the first ISO week to contain days
from
a previous year. If they didn't then it would be impossible to consistently
start
weeks on Mondays since Jan.1 is not always a Monday. If you apply the ISO 8601
definition to the dates in question here you will find PHP is quite correct
here.
------------------------------------------------------------------------
[2013-09-21 11:04:29] glavic at gmail dot com
Description:
------------
DateTime::format('W') returns wrong week number when date is 2013-12-30 or
2013-12-31.
Test script:
---------------
<?php
$dt = new DateTime;
for ($w = 52; $w <= 54; $w++) {
$dt->setISODate(2013, $w);
print_r($dt);
echo $dt->format('Y W') . "\n\n";
}
# see this script running on all php versions http://3v4l.org/9aua5
Expected result:
----------------
DateTime Object
(
[date] => 2013-12-23 11:02:12
[timezone_type] => 3
[timezone] => UTC
)
2013 52
DateTime Object
(
[date] => 2013-12-30 11:02:12
[timezone_type] => 3
[timezone] => UTC
)
2014 01 # or 2013 53, but surely not 2013 01 !!!
DateTime Object
(
[date] => 2014-01-06 11:02:12
[timezone_type] => 3
[timezone] => UTC
)
2014 02
Actual result:
--------------
DateTime Object
(
[date] => 2013-12-23 11:02:12
[timezone_type] => 3
[timezone] => UTC
)
2013 52
DateTime Object
(
[date] => 2013-12-30 11:02:12
[timezone_type] => 3
[timezone] => UTC
)
2013 01
DateTime Object
(
[date] => 2014-01-06 11:02:12
[timezone_type] => 3
[timezone] => UTC
)
2014 02
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=65730&edit=1