]>
Commit | Line | Data |
---|---|---|
4f5b44bd NL |
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 | } |