diff options
Diffstat (limited to 'vendor/symfony/form/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToRfc3339Transformer.php')
-rw-r--r-- | vendor/symfony/form/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToRfc3339Transformer.php | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/vendor/symfony/form/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToRfc3339Transformer.php b/vendor/symfony/form/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToRfc3339Transformer.php new file mode 100644 index 00000000..0eb07422 --- /dev/null +++ b/vendor/symfony/form/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToRfc3339Transformer.php | |||
@@ -0,0 +1,82 @@ | |||
1 | <?php | ||
2 | |||
3 | /* | ||
4 | * This file is part of the Symfony package. | ||
5 | * | ||
6 | * (c) Fabien Potencier <fabien@symfony.com> | ||
7 | * | ||
8 | * For the full copyright and license information, please view the LICENSE | ||
9 | * file that was distributed with this source code. | ||
10 | */ | ||
11 | |||
12 | namespace Symfony\Component\Form\Extension\Core\DataTransformer; | ||
13 | |||
14 | use Symfony\Component\Form\Exception\TransformationFailedException; | ||
15 | |||
16 | /** | ||
17 | * @author Bernhard Schussek <bschussek@gmail.com> | ||
18 | */ | ||
19 | class DateTimeToRfc3339Transformer extends BaseDateTimeTransformer | ||
20 | { | ||
21 | /** | ||
22 | * {@inheritDoc} | ||
23 | */ | ||
24 | public function transform($dateTime) | ||
25 | { | ||
26 | if (null === $dateTime) { | ||
27 | return ''; | ||
28 | } | ||
29 | |||
30 | if (!$dateTime instanceof \DateTime) { | ||
31 | throw new TransformationFailedException('Expected a \DateTime.'); | ||
32 | } | ||
33 | |||
34 | if ($this->inputTimezone !== $this->outputTimezone) { | ||
35 | $dateTime = clone $dateTime; | ||
36 | $dateTime->setTimezone(new \DateTimeZone($this->outputTimezone)); | ||
37 | } | ||
38 | |||
39 | return preg_replace('/\+00:00$/', 'Z', $dateTime->format('c')); | ||
40 | } | ||
41 | |||
42 | /** | ||
43 | * {@inheritDoc} | ||
44 | */ | ||
45 | public function reverseTransform($rfc3339) | ||
46 | { | ||
47 | if (!is_string($rfc3339)) { | ||
48 | throw new TransformationFailedException('Expected a string.'); | ||
49 | } | ||
50 | |||
51 | if ('' === $rfc3339) { | ||
52 | return null; | ||
53 | } | ||
54 | |||
55 | try { | ||
56 | $dateTime = new \DateTime($rfc3339); | ||
57 | } catch (\Exception $e) { | ||
58 | throw new TransformationFailedException($e->getMessage(), $e->getCode(), $e); | ||
59 | } | ||
60 | |||
61 | if ($this->outputTimezone !== $this->inputTimezone) { | ||
62 | try { | ||
63 | $dateTime->setTimezone(new \DateTimeZone($this->inputTimezone)); | ||
64 | } catch (\Exception $e) { | ||
65 | throw new TransformationFailedException($e->getMessage(), $e->getCode(), $e); | ||
66 | } | ||
67 | } | ||
68 | |||
69 | if (preg_match('/(\d{4})-(\d{2})-(\d{2})/', $rfc3339, $matches)) { | ||
70 | if (!checkdate($matches[2], $matches[3], $matches[1])) { | ||
71 | throw new TransformationFailedException(sprintf( | ||
72 | 'The date "%s-%s-%s" is not a valid date.', | ||
73 | $matches[1], | ||
74 | $matches[2], | ||
75 | $matches[3] | ||
76 | )); | ||
77 | } | ||
78 | } | ||
79 | |||
80 | return $dateTime; | ||
81 | } | ||
82 | } | ||