While jumping between PHP and JavaScript – one of the most annoying things is dates handling.

Recently, one of the clients reported that, while using our app for appointments and work schedule – they lost one of the working days. Client’s worker was supposed to work on the 31st of December 2019.

Firstly, working on the 31st is an achievement. Since we can’t affect it, “bug report” was filled on our end. After few hours of debugging, the problem was found.  

CakePHP uses Cake\I18n\Time class to handle date time. It’s an ancestor of chronos library under the hood. As a result, when you’re working with DateTime object, the formatting slightly changes. Thankfully, I was not the only one who accidentally used “year” notation wrong. 

use \Cake\I18n\Time;

$badDayToWork = '2018-12-31 09:00:00';
$time = new Time($badTimeToWork);

print_r($time);
/*
output:
Cake\I18n\Time Object(    
    [time] => 2018-12-31T09:00:00+02:00    
   [timezone] => Asia/Nicosia    
   [fixedNowTime] =>
)
*/

print_r($time->i18nFormat('YYYY-MM-dd HH:mm'));

// Output: 2019-12-31 09:00.

One tiny bit I missed was incorrect “Y” formatting flag.

yyyy (year)
2018
YYYY (year of “Week of Year”)2019

In this case, 2018-12-31 falls on Monday, so according to ICU documentation – it’s year 2019.