|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2012-11-14 19:00 UTC] linesarefuzzy at gmail dot com
Description: ------------ Adding 5 weekdays to a Friday, Saturday or Sunday returns the following Sunday instead of Friday. Same issue when adding multiples of 5. Starting with any other weekday works as expected, as does adding any other number of weekdays. Test script: --------------- echo date ( 'l, F j, Y', strtotime ( 'friday + 1 weekdays' ) ) . "\n"; echo date ( 'l, F j, Y', strtotime ( 'friday + 2 weekdays' ) ) . "\n"; echo date ( 'l, F j, Y', strtotime ( 'friday + 3 weekdays' ) ) . "\n"; echo date ( 'l, F j, Y', strtotime ( 'friday + 4 weekdays' ) ) . "\n"; echo date ( 'l, F j, Y', strtotime ( 'friday + 5 weekdays' ) ) . "\n"; echo "\n"; echo date ( 'l, F j, Y', strtotime ( 'saturday + 1 weekdays' ) ) . "\n"; echo date ( 'l, F j, Y', strtotime ( 'saturday + 2 weekdays' ) ) . "\n"; echo date ( 'l, F j, Y', strtotime ( 'saturday + 3 weekdays' ) ) . "\n"; echo date ( 'l, F j, Y', strtotime ( 'saturday + 4 weekdays' ) ) . "\n"; echo date ( 'l, F j, Y', strtotime ( 'saturday + 5 weekdays' ) ) . "\n"; echo "\n"; echo date ( 'l, F j, Y', strtotime ( 'sunday + 1 weekdays' ) ) . "\n"; echo date ( 'l, F j, Y', strtotime ( 'sunday + 2 weekdays' ) ) . "\n"; echo date ( 'l, F j, Y', strtotime ( 'sunday + 3 weekdays' ) ) . "\n"; echo date ( 'l, F j, Y', strtotime ( 'sunday + 4 weekdays' ) ) . "\n"; echo date ( 'l, F j, Y', strtotime ( 'sunday + 5 weekdays' ) ) . "\n"; Expected result: ---------------- Monday, November 19, 2012 Tuesday, November 20, 2012 Wednesday, November 21, 2012 Thursday, November 22, 2012 Friday, November 23, 2012 Monday, November 19, 2012 Tuesday, November 20, 2012 Wednesday, November 21, 2012 Thursday, November 22, 2012 Friday, November 23, 2012 Monday, November 19, 2012 Tuesday, November 20, 2012 Wednesday, November 21, 2012 Thursday, November 22, 2012 Friday, November 23, 2012 Actual result: -------------- Monday, November 19, 2012 Tuesday, November 20, 2012 Wednesday, November 21, 2012 Thursday, November 22, 2012 Sunday, November 25, 2012 Monday, November 19, 2012 Tuesday, November 20, 2012 Wednesday, November 21, 2012 Thursday, November 22, 2012 Sunday, November 25, 2012 Monday, November 19, 2012 Tuesday, November 20, 2012 Wednesday, November 21, 2012 Thursday, November 22, 2012 Sunday, November 25, 2012 PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Fri Oct 24 07:00:01 2025 UTC |
Jon-- Since the bug always results in Sunday when it should be Friday, an obvious workaround would be to test the weekday of the result, and if it's Sunday, subtract two days. For example: <?php if (date('l', $timestamp) == 'Sunday') $timestamp = strtotime(date('Y-m-d', $timestamp) . ' - 2 days'); ?>Seems to affect DateTime::modify too. $dt = new DateTime("2013-01-04"); echo $dt->modify("+5 weekdays")->format("Y-m-d H:i:s l") . "<br/>"; $dt = new DateTime("2013-01-05"); echo $dt->modify("+5 weekdays")->format("Y-m-d H:i:s l") . "<br/>"; $dt = new DateTime("2013-01-06"); echo $dt->modify("+5 weekdays")->format("Y-m-d H:i:s l") . "<br/>"; $dt = new DateTime("2013-01-07"); echo $dt->modify("+5 weekdays")->format("Y-m-d H:i:s l") . "<br/>"; Got: 2013-01-13 00:00:00 Sunday 2013-01-13 00:00:00 Sunday 2013-01-13 00:00:00 Sunday 2013-01-14 00:00:00 MondayThere is one more issue. date('Y-m-d',strtotime(date('Y-m-d', strtotime('2013-04-22' . " +5 Weekday")))); Expected result: 2013-04-29 (Monday) Actual result:2013-04-29 (Monday) fine but when u do, date('Y-m-d',strtotime(date('Y-m-d', strtotime('2013-04-29' . " -5 Weekday")))); Expected result: 2013-04-22 (Monday) Actual result:2013-04-20 (Saturday)Here is a simple workaround function for adding and subtracting weekdays: function addWeekDays(DateTime $date, $numDays) { $numDays = (int)($numDays); // ensure integer! $interval = new DateInterval('P1D'); // 1 day while ($numDays != 0) { if ($numDays > 0) $date->add($interval); else $date->sub($interval); $dayOfWeek = $date->format('N'); // 1 (Monday) .. 7 (Sunday) if (($dayOfWeek >= 1) && ($dayOfWeek <= 5)) { if ($numDays > 0) $numDays--; else $numDays++; } } return $date; }