81 lines
1.9 KiB
PHP
81 lines
1.9 KiB
PHP
<?php
|
|
|
|
/*
|
|
* This file is part of the Kimai time-tracking app.
|
|
*
|
|
* For the full copyright and license information, please view the LICENSE
|
|
* file that was distributed with this source code.
|
|
*/
|
|
|
|
namespace App\Doctrine;
|
|
|
|
use Doctrine\DBAL\Platforms\AbstractPlatform;
|
|
use Doctrine\DBAL\Types\ConversionException;
|
|
use Doctrine\DBAL\Types\DateTimeType;
|
|
|
|
class UTCDateTimeType extends DateTimeType
|
|
{
|
|
/**
|
|
* @var \DateTimeZone|null
|
|
*/
|
|
private static $utc;
|
|
|
|
/**
|
|
* @param mixed $value
|
|
* @param AbstractPlatform $platform
|
|
* @return mixed|string
|
|
* @throws ConversionException
|
|
*/
|
|
public function convertToDatabaseValue($value, AbstractPlatform $platform)
|
|
{
|
|
if ($value instanceof \DateTime) {
|
|
$value = clone $value;
|
|
$value->setTimezone(self::getUtc());
|
|
}
|
|
|
|
return parent::convertToDatabaseValue($value, $platform);
|
|
}
|
|
|
|
/**
|
|
* @return \DateTimeZone
|
|
*/
|
|
public static function getUtc()
|
|
{
|
|
return self::$utc ? self::$utc : self::$utc = new \DateTimeZone('UTC');
|
|
}
|
|
|
|
/**
|
|
* @param mixed $value
|
|
* @param AbstractPlatform $platform
|
|
* @return bool|\DateTime|false|mixed
|
|
* @throws ConversionException
|
|
*/
|
|
public function convertToPHPValue($value, AbstractPlatform $platform)
|
|
{
|
|
if (null === $value || $value instanceof \DateTime) {
|
|
return $value;
|
|
}
|
|
|
|
$converted = \DateTime::createFromFormat(
|
|
$platform->getDateTimeFormatString(),
|
|
$value,
|
|
self::getUtc()
|
|
);
|
|
|
|
if (!$converted) {
|
|
throw ConversionException::conversionFailedFormat(
|
|
$value,
|
|
$this->getName(),
|
|
$platform->getDateTimeFormatString()
|
|
);
|
|
}
|
|
|
|
return $converted;
|
|
}
|
|
|
|
public function requiresSQLCommentHint(AbstractPlatform $platform)
|
|
{
|
|
return true;
|
|
}
|
|
}
|