code: public static function EDATE($dateValue = 1, $adjustmentMonths = 0)
      {
          $dateValue = Functions::flattenSingleValue($dateValue);
          $adjustmentMonths = Functions::flattenSingleValue($adjustmentMonths);
  
          if (!is_numeric($adjustmentMonths)) {
              return Functions::VALUE();
          }
          $adjustmentMonths = floor($adjustmentMonths);
  
          if (is_string($dateValue = self::getDateValue($dateValue))) {
              return Functions::VALUE();
          }
  
          // Execute function
          $PHPDateObject = self::adjustDateByMonths($dateValue, $adjustmentMonths);
  
          switch (Functions::getReturnDateType()) {
              case Functions::RETURNDATE_EXCEL:
                  return (float) Date::PHPToExcel($PHPDateObject);
              case Functions::RETURNDATE_PHP_NUMERIC:
                  return (int) Date::excelToTimestamp(Date::PHPToExcel($PHPDateObject));
              case Functions::RETURNDATE_PHP_OBJECT:
                  return $PHPDateObject;
          }
      }
docs: EDATE.
  
  Returns the serial number that represents the date that is the indicated number of months
  before or after a specified date (the start_date).
  Use EDATE to calculate maturity dates or due dates that fall on the same day of the month
  as the date of issue.
  
  Excel Function:
  EDATE(dateValue,adjustmentMonths)
  
  @param mixed $dateValue Excel date serial value (float), PHP date timestamp (integer),
  PHP DateTime object, or a standard date string
  @param int $adjustmentMonths The number of months before or after start_date.
  A positive value for months yields a future date;
  a negative value yields a past date.
  
  @return mixed Excel date/time serial value, PHP date/time serial value or PHP date/time object,
  depending on the value of the ReturnDateType flag