ID: 40271
User updated by: slomo at sonarkollektiv dot de
Reported By: slomo at sonarkollektiv dot de
-Status: Feedback
+Status: Open
Bug Type: Date/time related
Operating System: Mac OS X 10.4.8
PHP Version: 5.2.0
New Comment:
My "Reproduce code" was quite complete. Here it is again,
this time it starts with <?php and ends with ?> :-)
I expect: using strtotime("last monday") should behave
always the same. If you run my code you will see that it
differs depending on the given date. My code is not complex,
so I hope you get the point very soon.
This "Day of week items" are a little bit confusing, because
if you have e.g. a $date for a monday and state strtotime
("$date last monday"), you get $date. I assume this is
correct.
Anyway I would think it's just my fault if my function would
be "off 1 week" for the whole year if the date is a monday
every time. But this happens only for the first week, in any
other week the result is like I learned strtotime() is doing
it.
Can you follow?
<?php
function MondayOfWeek($year, $week) {
return strtotime("$year-01-04 UTC + " . ($week-1) . '
week last monday');
}
for ($y = 1998; $y < 2012; $y++) {
for ($w = 1; $w < 53; $w++) {
$start = MondayOfWeek($y, $w);
$end = strtotime("+6 day", $start);
echo "KW $w/$y: " . gmstrftime('%A, %x %X', $start)
. ' - ' . gmstrftime('%A, %x %X', $end) . ' - reverse check
(week/year): ' . gmstrftime('%V/%G', $start) . "<br />\n";
if ($w != gmstrftime('%V', $start) || $y !=
gmstrftime('%G', $start)) {
echo '<span style="color: red;">Oops,
EXCEPTIONAL ERROR!</span>' . "<br />\n";
}
}
echo "<hr>\n";
}
?>
best regards,
slomo
Previous Comments:
------------------------------------------------------------------------
[2007-01-29 11:50:06] [EMAIL PROTECTED]
You can also just use "strtotime('2007W011')"; for Monday "1", of Week
1 ("01") of year 2007 ("2007").
------------------------------------------------------------------------
[2007-01-29 11:33:36] [EMAIL PROTECTED]
And please do not forget about expected and actual results.
Thank you.
------------------------------------------------------------------------
[2007-01-29 11:32:05] [EMAIL PROTECTED]
Thank you for this bug report. To properly diagnose the problem, we
need a short but complete example script to be able to reproduce
this bug ourselves.
A proper reproducing script starts with <?php and ends with ?>,
is max. 10-20 lines long and does not require any external
resources such as databases, etc. If the script requires a
database to demonstrate the issue, please make sure it creates
all necessary tables, stored procedures etc.
Please avoid embedding huge scripts into the report.
------------------------------------------------------------------------
[2007-01-29 11:20:44] slomo at sonarkollektiv dot de
Description:
------------
I was looking for a neat solution for the task "get the date
for a given weeknumber and weekyear". I thought I got it, but
there is a strange behaviour if (and only if) week no. is 1
and 4th of January is already a monday. See my code to
reproduce the results, it's quite confusing.
The idea was:
- 4th of January is always in week no. 1
- add the missing weeks
- make it a monday of that week acording to the GNU Date Input
Formats syntax descibed at http://www.gnu.org/software/tar/
manual/html_node/tar_114.html#SEC114
So either me or PHP still does not get it right.
Reproduce code:
---------------
function MondayOfWeek($year, $week) {
return strtotime("$year-01-04 UTC + " . ($week-1) . ' week last
monday');
}
for ($y = 1998; $y < 2012; $y++) {
for ($w = 1; $w < 53; $w++) {
$start = MondayOfWeek($y, $w);
$end = strtotime("+6 day", $start);
echo "KW $w/$y: " . gmstrftime('%A, %x %X', $start) . ' - ' .
gmstrftime('%A, %x %X', $end) . " ";
echo '- reverse check (week/year): ' . gmstrftime('%V/%G',
$start) .
"\n";
if ($w != gmstrftime('%V', $start) || $y != gmstrftime('%G',
$start))
{
echo "ERROR!\n";
}
}
echo "<hr>\n";
}
Expected result:
----------------
accurate results for every week number and year with always
the same behaviour ...
Actual result:
--------------
if week no. is 1 and 4th of January is already a monday, the
function returns timestamps for the "previous week".
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=40271&edit=1