|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2013-09-21 11:04 UTC] 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
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Fri Oct 24 22:00:02 2025 UTC |
@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 ;)2013-12-30 ('Y W');" returns "2013 01" is correct. The 'Y' is the year. The ISO 8601 Year for 2013-12-30 is obviously 2013. However the ISO 8601 Week number for 2013-12-30 is also just as obviously 1. So 2013 01 is correct. And your next statement makes no sense either: "So now we have two identical week number for year 2013 with a year difference between dates ;)" We are talking about Dec.30 and 31 in 2013. That is Monday and Tuesday. They both fall in ISO week 1 and they are both in 2013. Wednesday Jan.1 2014 also falls in ISO week 1 even though it is in 2014. That's how ISO weeks work. Is your confusion that you think the 'Y' has to be associated with the 'W' somehow? The 'Y' refers to the date you are formatting.I made a copy/paste typo before, but that doesn't matter now because you said that 'Y' returns the year of the date, which is totally correct, where was my head... I understand what you are saying; I agree that Dec 30 and 31 fall in week 1; but year 2014, not 2013. Maybe I should rephrase my question: how do I get correct week year from "echo (new DateTime('2013-12-30'))->format('W ????');" ?