/** * If possible, returns one of these strings (comparing today's date with the due date): * _ yesterday * _ today * _ tomorrow * _ the week-day corresponding to 'in2days, Wed' (i.e.: Wednesday) * _ the week-day corresponding to 'in3days, Thu' * _ the week-day corresponding to 'in4days, Fri' * _ the week-day corresponding to 'in5days, Sat' * If any of those is unapplicable, it returns getFormattedLocalDueDate() * * @return string */ public function getHumanFriendlyDueDate() { $dateFormat = DateFormat::getInstance(); $formattedDueDate = $this->getFormattedLocalDueDate(); if (!$formattedDueDate) { return ''; } $dueDateTimestamp = $dateFormat->getTimestamp($formattedDueDate); $todayTimestamp = PcUserPeer::getLoggedInUser()->getTime(); $tomorrowTimestamp = $todayTimestamp + 86400; $yesterdayTimestamp = $todayTimestamp - 86400; list($tomorrowDay, $tomorrowMonth, $tomorrowYear) = explode('-', date('d-m-Y', $tomorrowTimestamp)); list($todayDay, $todayMonth, $todayYear) = explode('-', date('d-m-Y', $todayTimestamp)); list($yesterdayDay, $yesterdayMonth, $yesterdayYear) = explode('-', date('d-m-Y', $yesterdayTimestamp)); $todayStart = mktime(0, 0, 0, $todayMonth, $todayDay, $todayYear); $todayEnd = mktime(23, 59, 59, $todayMonth, $todayDay, $todayYear); $tomorrowStart = mktime(0, 0, 0, $tomorrowMonth, $tomorrowDay, $tomorrowYear); $tomorrowEnd = mktime(23, 59, 59, $tomorrowMonth, $tomorrowDay, $tomorrowYear); $yesterdayStart = mktime(0, 0, 0, $yesterdayMonth, $yesterdayDay, $yesterdayYear); $yesterdayEnd = mktime(23, 59, 59, $yesterdayMonth, $yesterdayDay, $yesterdayYear); if ($todayStart < $dueDateTimestamp && $dueDateTimestamp < $todayEnd) { return __('ACCOUNT_MISC_TODAY'); } if ($dueDateTimestamp < $todayStart) { if ($yesterdayStart < $dueDateTimestamp && $dueDateTimestamp < $yesterdayEnd) { return __('ACCOUNT_MISC_YESTERDAY'); } } if ($dueDateTimestamp > $todayEnd) { if ($tomorrowStart < $dueDateTimestamp && $dueDateTimestamp < $tomorrowEnd) { return __('ACCOUNT_MISC_TOMORROW'); } // the task is not in the future but not tomorrow // we will check whether it is within the next 5 days $deltaSinceTomorrowSec = $dueDateTimestamp - $tomorrowEnd; $deltaSinceTomorrowDays = ceil($deltaSinceTomorrowSec / 86400); // I'm adding 1 because $deltaDays has got tomorrow as a reference $deltaDays = $deltaSinceTomorrowDays + 1; if ($deltaDays <= 5) { // We need to display something like 'in3days, Thu' // I need to get the day of the week to display $weekDays = array('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'); $localizedWeekDays = array(__('ACCOUNT_DOW_SUN'), __('ACCOUNT_DOW_MON'), __('ACCOUNT_DOW_TUE'), __('ACCOUNT_DOW_WED'), __('ACCOUNT_DOW_THU'), __('ACCOUNT_DOW_FRI'), __('ACCOUNT_DOW_SAT')); $todayWeekDay = date('D', PcUserPeer::getLoggedInUser()->getTime()); if (($todayWeekDayKey = array_search($todayWeekDay, $weekDays)) === FALSE) { throw new Exception('Couldn\'t find the right week day key for today'); } $dueDateWeekDayIndex = ($todayWeekDayKey + $deltaDays) % 7; $dueDateWeekDay = $localizedWeekDays[$dueDateWeekDayIndex]; return sprintf(__('ACCOUNT_MISC_IN_X_DAYS'), $deltaDays) . ', ' . ucfirst($dueDateWeekDay); } } // At this point, we realized we can't apply any shortcut // we don't specify the year if it is the current one if ($this->getDueDate('Y') == date('Y', PcUserPeer::getLoggedInUser()->getTime())) { return $this->getDueDate("j") . ' ' . PcUtils::fromIndexToMonth($this->getDueDate('n')) . ', ' . ucfirst(PcUtils::fromIndexToWeekday($this->getDueDate('N'))); } else { // return $this->getDueDate('j M Y'); return $this->getDueDate("j") . ' ' . PcUtils::fromIndexToMonth($this->getDueDate('n')) . ' ' . $this->getDueDate('Y'); } }