| 
        php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login | 
  [2009-10-16 16:45 UTC] kgrecki at gmail dot com
 Description:
------------
call to modify('last day') has different effect in PHP 5.3 than in 5.2
It used to return a previous day, now it seems to return last day of the month,
according to http://www.gnu.org/software/automake/manual/tar/General-date-syntax.html#SEC115 "last" means -1 so 5.2 seems to get it right
Reproduce code:
---------------
date_default_timezone_set('Europe/London');
$dt = new DateTime('today');
var_dump($dt->format('c'));
$dt->modify('last day');
var_dump($dt->format('c'));
$dt = new DateTime('01-04-2009');
var_dump($dt->format('c'));
$dt->modify('last day');
var_dump($dt->format('c'));
Expected result:
----------------
PHP 5.2.11 (cli) (built: Sep 18 2009 10:59:00) 
string(25) "2009-10-16T00:00:00+01:00"
string(25) "2009-10-15T00:00:00+01:00"
string(25) "2009-04-01T00:00:00+01:00"
string(25) "2009-03-31T00:00:00+01:00"
Actual result:
--------------
PHP 5.3.0 (cli) (built: Jul 21 2009 17:02:21) 
string(25) "2009-10-16T00:00:00+01:00"
string(25) "2009-10-31T00:00:00+00:00"
string(25) "2009-04-01T00:00:00+01:00"
string(25) "2009-04-30T00:00:00+01:00"
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits             
             | 
    |||||||||||||||||||||||||||||||||||||
            
                 
                Copyright © 2001-2025 The PHP GroupAll rights reserved.  | 
        Last updated: Mon Nov 03 16:00:02 2025 UTC | 
The cause of the problem seems to be the optional 'of' in the regex specification for the relative date operators 'first day of' and 'last day of'. After applying the following patch (and regenerating parse_date.c) $dt->modify('first day'); is handled by the "relativetext" code block in parse_date.re and $dt->modify('first day of'); is handled by the "firstdayof | lastdayof" code block in parse_date.re Index: ext/date/lib/parse_date.re =================================================================== --- ext/date/lib/parse_date.re (revision 293574) +++ ext/date/lib/parse_date.re (working copy) @@ -931,8 +931,8 @@ isoweekday = year4 "-"? "W" weekofyear "-"? [0-7]; isoweek = year4 "-"? "W" weekofyear; exif = year4 ":" monthlz ":" daylz " " hour24lz ":" minutelz ":" secondlz; -firstdayof = 'first day' ' of'?; -lastdayof = 'last day' ' of'?; +firstdayof = 'first day of'; +lastdayof = 'last day of'?; backof = 'back of ' hour24 space? meridian?; frontof = 'front of ' hour24 space? meridian?;