1.20.x date.class.inc public BackdropDateTime::__construct($time = 'now', $tz = NULL, $format = NULL)

Constructs a date object.

Parameters

string $time: A date/time string or array. Defaults to 'now'.

object|string|null $tz: PHP DateTimeZone object, string or NULL allowed. Defaults to NULL.

string $format: PHP date() type format for parsing. Doesn't support timezones; if you have a timezone, send NULL and the default constructor method will hopefully parse it. $format is recommended in order to use negative or large years, on which PHP's parser fails.

File

includes/date.class.inc, line 45

Class

BackdropDateTime
Extends PHP DateTime class for use with Backdrop.

Code

public function __construct($time = 'now', $tz = NULL, $format = NULL) {
  $this->timeOnly = FALSE;
  $this->dateOnly = FALSE;

  // Store the raw time input so it is available for validation.
  $this->originalTime = $time;

  // Allow string timezones.
  if (!empty($tz) && !is_object($tz)) {
    $tz = new DateTimeZone($tz);
  }
  // Default to the site timezone when not explicitly provided.
  elseif (empty($tz)) {
    $tz = date_default_timezone_object();
  }
  // Special handling for Unix timestamps expressed in the local timezone.
  // Create a date object in UTC and convert it to the local timezone. Don't
  // try to turn things like '2010' with a format of 'Y' into a timestamp.
  if (is_numeric($time) && (empty($format) || $format == 'U')) {
    // Assume timestamp.
    $time = "@" . $time;
    $date = new BackdropDateTime($time, 'UTC');
    if ($tz->getName() != 'UTC') {
      $date->setTimezone($tz);
    }
    $time = $date->format(DATE_FORMAT_DATETIME);
    $format = DATE_FORMAT_DATETIME;
    $this->addGranularity('timezone');
  }
  elseif (is_array($time)) {
    // Assume we were passed an indexed array.
    if (empty($time['year']) && empty($time['month']) && empty($time['day'])) {
      $this->timeOnly = TRUE;
    }
    if (empty($time['hour']) && empty($time['minute']) && empty($time['second'])) {
      $this->dateOnly = TRUE;
    }
    $this->errors = $this->arrayErrors($time);
    // Make this into an ISO date, forcing a full ISO date even if some values
    // are missing.
    $time = $this->toISO($time, TRUE);
    // We checked for errors already, skip parsing the input values.
    $format = NULL;
  }
  else {
    // Make sure dates like 2010-00-00T00:00:00 get converted to
    // 2010-01-01T00:00:00 before creating a date object
    // to avoid unintended changes in the month or day.
    $time = date_make_iso_valid($time);
  }

  // The parse function will also set errors on the date parts.
  $successfully_parsed = FALSE;
  if (!empty($format)) {
    $arg = self::$allgranularity;
    $element = array_pop($arg);
    while (!$this->parse($time, $tz, $format) && $element != 'year') {
      $element = array_pop($arg);
      $format = date_limit_format($format, $arg);
    }
    $successfully_parsed = empty($this->errors);

    // Remove the invalid error so it can be tried again by PHP's parser.
    if (isset($this->errors['invalid'])) {
      unset($this->errors['invalid']);
    }
  }
  if (!$successfully_parsed && is_string($time)) {
    // PHP < 5.3 doesn't like the GMT- notation for parsing timezones.
    $time = str_replace("GMT-", "-", $time);
    $time = str_replace("GMT+", "+", $time);
    // We are going to let the parent DateTime object do a best effort attempt
    // to turn this string into a valid date. It might fail and we want to
    // control the error messages.
    if (strtotime($time) !== FALSE) {
      parent::__construct($time, $tz);
    }
    else {
      $this->errors['date'] = t('The date "!date" does not match the expected format.', array('!date' => $time));
      return;
    }
    if (empty($this->granularity)) {
      $this->setGranularityFromTime($time, $tz);
    }
  }

  // If we haven't got a valid timezone name yet, we need to set one or
  // we will get undefined index errors.
  // This can happen if $time had an offset or no timezone.
  if (!$this->getTimezone() || !preg_match('/[a-zA-Z]/', $this->getTimezone()->getName())) {

    // If the original $tz has a name, use it.
    if (preg_match('/[a-zA-Z]/', $tz->getName())) {
      $this->setTimezone($tz);
    }
    // We have no information about the timezone so must fallback to a default.
    else {
      $this->setTimezone(new DateTimeZone("UTC"));
      $this->errors['timezone'] = t('No valid timezone name was provided.');
    }
  }
}