|  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #75477 last weekday of this month returns previous month when date is set
Submitted: 2017-11-03 10:38 UTC Modified: 2017-11-03 10:40 UTC
From: wouter at deinternetjongens dot nl Assigned:
Status: Open Package: Date/time related
PHP Version: 7.1.11 OS: Linux, mac os
Private report: No CVE-ID: None
Have you experienced this issue?
Rate the importance of this bug to you:

 [2017-11-03 10:38 UTC] wouter at deinternetjongens dot nl
We came across a `bug` when trying to get the last weekday of a month.
When we first setted a new date and afterwards modified it to get the last weekday of that month it returns the last weekday of the month before the month given.

Test script:
$datetime = new DateTime()->setDate(2017, 12, 1);
var_dump($datetime->modify('last weekday this month');

Expected result:
DateTime {#12086
  +"date": "2017-12-30 00:00:00.000000",
  +"timezone_type": 3,
  +"timezone": "UTC",

Actual result:
DateTime {#12086
  +"date": "2017-11-30 00:00:00.000000",
  +"timezone_type": 3,
  +"timezone": "UTC",


Add a Patch

Pull Requests

Add a Pull Request


AllCommentsChangesGit/SVN commitsRelated reports
 [2017-11-03 10:40 UTC] wouter at deinternetjongens dot nl
Expected result should be :
DateTime {#12086
  +"date": "2017-12-29 00:00:00.000000",
  +"timezone_type": 3,
  +"timezone": "UTC",
 [2017-11-03 11:15 UTC] sjon at hortensius dot net
This is also described in the manual: - so this is basically a feature request.

You could use `last friday of December 2017` instead, see
 [2017-11-03 11:50 UTC] wouter at deinternetjonges dot nl
Ok, so this is expected behaviour.

What we are trying to accomplish is getting the last weekday of a month.
So if it is a day between Monday till Friday I want to get the last day of those in a month.

Hope you get where I want to go to with this.
If it still is a feature request how can I ask for something like this to be added ?
 [2017-11-27 20:59 UTC] vandevreken dot hannes at gmail dot com

The only thing it did was:
'last weekday'. Whatever you added next, didn't have much effect (this month doesn't modify it, and is executed first).
Last weekday literally means: going back in time, day by day, till a day has been found which is not a weekend day.

So what you can do is this sequence of modifications:

// Get the very last day in this month.
$datetime->modify('last day of this month');
// Add one day:
$datetime->modify('+1 day')
// Find the last weekday before this day (effectively the first day of next month).
$datetime->modify('last weekday');

Or: but this is very unreadable to anyone coming next:
$datetime->modify(last weekday first day of next month');

This will first go to next month, then get the first day of that month, then find the last weekday before that.
PHP Copyright © 2001-2021 The PHP Group
All rights reserved.
Last updated: Sun Feb 28 23:01:23 2021 UTC