/
DateTimeToTimestampTransformer.php
88 lines (73 loc) · 2.44 KB
/
DateTimeToTimestampTransformer.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Form\ValueTransformer;
use Symfony\Component\Form\Configurable;
use Symfony\Component\Form\Exception\UnexpectedTypeException;
/**
* Transforms between a timestamp and a DateTime object
*
* @author Bernhard Schussek <bernhard.schussek@symfony.com>
* @author Florian Eckerstorfer <florian@eckerstorfer.org>
*/
class DateTimeToTimestampTransformer extends Configurable implements ValueTransformerInterface
{
/**
* {@inheritDoc}
*/
protected function configure()
{
$this->addOption('input_timezone', date_default_timezone_get());
$this->addOption('output_timezone', date_default_timezone_get());
parent::configure();
}
/**
* Transforms a DateTime object into a timestamp in the configured timezone
*
* @param DateTime $value A DateTime object
* @return integer A timestamp
*/
public function transform($value)
{
if (null === $value) {
return null;
}
if (!$value instanceof \DateTime) {
throw new UnexpectedTypeException($value, '\DateTime');
}
$value->setTimezone(new \DateTimeZone($this->getOption('output_timezone')));
return (int)$value->format('U');
}
/**
* Transforms a timestamp in the configured timezone into a DateTime object
*
* @param string $value A value as produced by PHP's date() function
* @return DateTime A DateTime object
*/
public function reverseTransform($value)
{
if (null === $value) {
return null;
}
if (!is_numeric($value)) {
throw new UnexpectedTypeException($value, 'numeric');
}
$outputTimezone = $this->getOption('output_timezone');
$inputTimezone = $this->getOption('input_timezone');
try {
$dateTime = new \DateTime("@$value $outputTimezone");
if ($inputTimezone != $outputTimezone) {
$dateTime->setTimezone(new \DateTimeZone($inputTimezone));
}
return $dateTime;
} catch (\Exception $e) {
throw new \InvalidArgumentException('Expected a valid timestamp. ' . $e->getMessage(), 0, $e);
}
}
}