Source of file StringToTimeTransformer.php
Size: 3,500 Bytes - Last Modified: 2023-11-16T22:56:02+01:00
/home/websites/teicee/packagist/site/phpdoc/conf/../vendor/teicee/core-bundle/src/Form/DataTransformer/StringToTimeTransformer.php
| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 | <?phpnamespace TIC\CoreBundle\Form\DataTransformer; use Symfony\Component\Form\Extension\Core\DataTransformer\BaseDateTimeTransformer; use Symfony\Component\Form\Exception\TransformationFailedException; /** * Transforms between a time string and a DateTime object. */class StringToTimeTransformer extends BaseDateTimeTransformer {/** * Format used for generating strings. * * @var string */private $generateFormat = 'H:i:s'; /** * Transforms a \DateTime instance to a string. * * @see \DateTime::format() for supported formats * * @param string $inputTimezone The name of the input timezone * @param string $outputTimezone The name of the output timezone * @param string $format The date format * * @throws UnexpectedTypeException if a timezone is not a string */public function __construct($inputTimezone = null, $outputTimezone = null, $format = 'H:i:s') { parent::__construct($inputTimezone, $outputTimezone); if (! empty($format)) $this->generateFormat = $format; } /** * Transforms a DateTime object into a time string with the configured format * and timezone. * * @param \DateTimeInterface $dateTime A DateTimeInterface object * * @return string A value as produced by PHP's date() function * * @throws TransformationFailedException If the given value is not a \DateTimeInterface */public function reverseTransform($dateTime) { if (null === $dateTime) { return ''; } if (!$dateTime instanceof \DateTimeInterface) { throw new TransformationFailedException('Expected a \DateTimeInterface.'); } if (!$dateTime instanceof \DateTimeImmutable) { $dateTime = clone $dateTime; } $dateTime = $dateTime->setTimezone(new \DateTimeZone($this->outputTimezone)); return $dateTime->format($this->generateFormat); } /** * Transforms a time string in the configured timezone into a DateTime object. * * @param string $value A value as produced by PHP's date() function * * @return \DateTime|null An instance of \DateTime * * @throws TransformationFailedException If the given value is not a string, * or could not be transformed */public function transform($value) { if (empty($value)) { return null; } if (\preg_match('/(\d{1,2})([h:\s]+(\d{1,2})([m:\s]+(\d{1,2}))?)?/i', (string)$value, $m)) { $value = \sprintf('%02d:%02d:%02d', $m[1], isset($m[2]) ? $m[3] : 0, isset($m[4]) ? $m[5] : 0); } $outputTz = new \DateTimeZone($this->outputTimezone); $dateTime = \DateTime::createFromFormat('H:i:s', $value, $outputTz); $lastErrors = \DateTime::getLastErrors(); if (0 < $lastErrors['warning_count'] || 0 < $lastErrors['error_count']) { throw new TransformationFailedException(implode(', ', array_merge(array_values($lastErrors['warnings']), array_values($lastErrors['errors'])))); } try { if ($this->inputTimezone !== $this->outputTimezone) { $dateTime->setTimezone(new \DateTimeZone($this->inputTimezone)); } } catch (\Exception $e) { throw new TransformationFailedException($e->getMessage(), $e->getCode(), $e); } return $dateTime; } } |