PHP DateTime Разница (часы, дни, недели, месяцы)

Я создаю функцию PHP, которая будет возвращать разницу между двумя датами в формате: 2 месяца, 3 недели, 6 дней, 3 часа. Я пытался использовать класс PHP DateTime, но он возвращает только месяцы, дни и часы, и я не могу найти способ подсчета недель.

Это моя функция:

public function DateTimeDifference($FromDate, $ToDate) {
  $FromDate = new DateTime($FromDate);
  $ToDate   = new DateTime($ToDate);
  $Interval = $FromDate->diff($ToDate);

  $Difference["Hours"] = $Interval->h;
  $Difference["Days"] = $Interval->d;
  $Difference["Months"] = $Interval->m;

  return $Difference;
}

Теперь мне нужно, чтобы $Difference["Weeks"] также было включено в возвращаемые данные.

РЕДАКТИРОВАТЬ: Я знаю, что я могу разделить дни с 7 и получить недели, но это не приводит к правильному. Например: 2 месяца, 14 дней, 3 часа - Когда я разделю 14 дней на 7, я получу это: 2 месяца, 2 недели, 14 дней, 3 часа, и теперь это не тот же период.

2 ответа

Решение
public function DateTimeDifference($FromDate, $ToDate) {
  $FromDate = new DateTime($FromDate);
  $ToDate   = new DateTime($ToDate);
  $Interval = $FromDate->diff($ToDate);

  $Difference["Hours"] = $Interval->h;
  $Difference["Weeks"] = floor($Interval->d/7);
  $Difference["Days"] = $Interval->d % 7;
  $Difference["Months"] = $Interval->m;

  return $Difference;
}
      // this will only work from previous dates 
// difference between utc date time and custom date time

function FromUtcToCustomDateTimeDifference($ToDate)
{
    
    // Takes Two date time
    $UTC_DATE = new DateTime('now', new DateTimeZone('UTC'));
    $UTC_DATETIME = $UTC_DATE->format('Y-m-d H:i:s');
    
    // add your own date time 1
    $datetime1 = date_create(UTC_DATETIME);
    $datetime2 = date_create($ToDate);
   
    $Interval = date_diff($datetime1, $datetime2);

    // Count Number Of Days Difference
    
    $Day = $Interval->format('%a');
        
    if($Day > 1)
        {

            $Month = $Interval->format('%m');
            $Year = $Interval->format('%y');
            $Week = (int)($Interval->format('%a')/7);
            
            if($Year<1)
            {

                        if($Day <= 7)
                        {
                            return $Day > 1 ?  $Day.= " days ago" : $Day .= " day ago";

                        }

                        else if($Month<1)
                        {
                            
                        return $Week > 1 ?  $Week.= " weeks ago" : $Week .= " week ago";
                        }
                        
                        
                        return $Month > 1 ? $Month.= " months ago" : $Month .= " month ago";
            }
            else
            {
                return $Year > 1 ? $Year.= " years ago" : $Year .= " year ago";
                
            }

        
        }
        else
        {

            return "today";

        }

}

Другие вопросы по тегам