Bug in FrozenDate setToStringFormat

We have found a bug in the Frozendate::setToStringFormat() functionality. Sometimes the year gets incremented. For eaxample, if the provided date is 1958-12-31 and we modify its format with setToStringFormat(‘dd-MM-YYYY’), it will show on screen as 31-12-1959. This only happens when the date is December 31st. If we change the date to, for example, December 21st, then the year is shown properly.

The funny thing is that it’s nog a consistent bug. Sometimes the year does get incremented and sometimes it does not. We have been unable to find any sort of logical pattern to this. Below I have provided the code we used to study this issue.

$dates = [     
[new \Cake\I18n\FrozenDate('1968-12-31'),'31-12-1968',''],    
[new \Cake\I18n\FrozenDate('1969-12-31'),'31-12-1969',''],    
[new \Cake\I18n\FrozenDate('1970-12-31'),'31-12-1970',''],    
[new \Cake\I18n\FrozenDate('1971-12-31'),'31-12-1971',''],   
[new \Cake\I18n\FrozenDate('1972-12-31'),'31-12-1972',''],    
[new \Cake\I18n\FrozenDate('1973-12-31'),'31-12-1973',''],    
[new \Cake\I18n\FrozenDate('1974-12-31'),'31-12-1974',''],    
[new \Cake\I18n\FrozenDate('1975-12-31'),'31-12-1975',''],    
[new \Cake\I18n\FrozenDate('1976-12-31'),'31-12-1976',''],    
[new \Cake\I18n\FrozenDate('1977-12-31'),'31-12-1977',''],    
[new \Cake\I18n\FrozenDate('1978-12-31'),'31-12-1978',''],    
[new \Cake\I18n\FrozenDate('1979-12-31'),'31-12-1979',''],    
[new \Cake\I18n\FrozenDate('1980-12-31'),'31-12-1980',''],    
[new \Cake\I18n\FrozenDate('1981-12-31'),'31-12-1981',''],    
[new \Cake\I18n\FrozenDate('1982-12-31'),'31-12-1982',''],   
[new \Cake\I18n\FrozenDate('1983-12-31'),'31-12-1983',''],    
[new \Cake\I18n\FrozenDate('1984-12-31'),'31-12-1984',''],    
[new \Cake\I18n\FrozenDate('1985-12-31'),'31-12-1985',''],    
[new \Cake\I18n\FrozenDate('1986-12-31'),'31-12-1986',''],    
[new \Cake\I18n\FrozenDate('1987-12-31'),'31-12-1987',''],    
[new \Cake\I18n\FrozenDate('1988-12-31'),'31-12-1988',''],    
[new \Cake\I18n\FrozenDate('1989-12-31'),'31-12-1989',''],   
[new \Cake\I18n\FrozenDate('1990-12-31'),'31-12-1990',''],    
[new \Cake\I18n\FrozenDate('1991-12-31'),'31-12-1991',''],   
[new \Cake\I18n\FrozenDate('1992-12-31'),'31-12-1992',''],   
[new \Cake\I18n\FrozenDate('1993-12-31'),'31-12-1993',''],    
[new \Cake\I18n\FrozenDate('1994-12-31'),'31-12-1994',''],   
[new \Cake\I18n\FrozenDate('1995-12-31'),'31-12-1995',''],    
[new \Cake\I18n\FrozenDate('1996-12-31'),'31-12-1996',''],    
[new \Cake\I18n\FrozenDate('1997-12-31'),'31-12-1997',''],    
[new \Cake\I18n\FrozenDate('1998-12-31'),'31-12-1998',''],    
[new \Cake\I18n\FrozenDate('1999-12-31'),'31-12-1999',''],    
[new \Cake\I18n\FrozenDate('2000-12-31'),'31-12-2000',''],
];

$dates2 = [];
foreach ($dates as $dateobj){    

$dateobj[0]->setToStringFormat('dd-MM-YYYY');    
$dates2[] = [$dateobj[0], $dateobj[1], $dateobj[0]->format('d-m-Y')];
}

debug($dates2);

    Datums

<?php    
foreach($dates2 as $dateobj){        
echo '<li>';       
 $dateobj[0]->setToStringFormat('dd-MM-YYYY');
/*
 * $dateobj[1] = expected date
 * $dateobj[0] = date shown after setToStringFormat (sometimes increments year)
 * $dateobj[0]->format() = date shown after format (shows expected date)
 */        
echo '<span class="data">'.$dateobj[1].' | '.$dateobj[0].' | '.$dateobj[0]->format('d-m-Y').'</span>';        echo '</li>';    
}    
?>
</ul>

You are mixing up 2 different ways of how date-formats can be configured in CakePHP:

Those look the very similar but behave differently.

So to fix your problem you will have to use

$dateobj[0]->setToStringFormat('dd-MM-yyyy');

instead of

$dateobj[0]->setToStringFormat('dd-MM-YYYY');