You are here

public function DateTimeNormalizer::denormalize in Drupal 8

Same name and namespace in other branches
  1. 9 core/modules/serialization/src/Normalizer/DateTimeNormalizer.php \Drupal\serialization\Normalizer\DateTimeNormalizer::denormalize()
2 calls to DateTimeNormalizer::denormalize()
DateTimeIso8601Normalizer::denormalize in core/modules/serialization/src/Normalizer/DateTimeIso8601Normalizer.php
Denormalizes data back into an object of the given class.
TimestampNormalizer::denormalize in core/modules/serialization/src/Normalizer/TimestampNormalizer.php
Denormalizes data back into an object of the given class.
2 methods override DateTimeNormalizer::denormalize()
DateTimeIso8601Normalizer::denormalize in core/modules/serialization/src/Normalizer/DateTimeIso8601Normalizer.php
Denormalizes data back into an object of the given class.
TimestampNormalizer::denormalize in core/modules/serialization/src/Normalizer/TimestampNormalizer.php
Denormalizes data back into an object of the given class.

File

core/modules/serialization/src/Normalizer/DateTimeNormalizer.php, line 89

Class

DateTimeNormalizer
Converts values for datetime objects to RFC3339 and from common formats.

Namespace

Drupal\serialization\Normalizer

Code

public function denormalize($data, $class, $format = NULL, array $context = []) {

  // This only knows how to denormalize datetime strings and timestamps. If
  // something else is received, let validation constraints handle this.
  if (!is_string($data) && !is_numeric($data)) {
    return $data;
  }

  // Loop through the allowed formats and create a \DateTime from the
  // input data if it matches the defined pattern. Since the formats are
  // unambiguous (i.e., they reference an absolute time with a defined time
  // zone), only one will ever match.
  $allowed_formats = isset($context['datetime_allowed_formats']) ? $context['datetime_allowed_formats'] : $this->allowedFormats;
  foreach ($allowed_formats as $format) {
    $date = \DateTime::createFromFormat($format, $data);
    $errors = \DateTime::getLastErrors();
    if ($date !== FALSE && empty($errors['errors']) && empty($errors['warnings'])) {
      return $date;
    }
  }
  $format_strings = [];
  foreach ($allowed_formats as $label => $format) {
    $format_strings[] = "\"{$format}\" ({$label})";
  }
  $formats = implode(', ', $format_strings);
  throw new UnexpectedValueException(sprintf('The specified date "%s" is not in an accepted format: %s.', $data, $formats));
}