diff --git a/config/packages/doctrine.yaml b/config/packages/doctrine.yaml index 7fef3c5..ca2f098 100644 --- a/config/packages/doctrine.yaml +++ b/config/packages/doctrine.yaml @@ -7,6 +7,8 @@ doctrine: url: '%env(resolve:DATABASE_URL)%' logging: true profiling: true + types: + datetime: App\Doctrine\CarbonDateTimeType orm: auto_generate_proxy_classes: '%kernel.debug%' diff --git a/src/Doctrine/CarbonDateTimeType.php b/src/Doctrine/CarbonDateTimeType.php new file mode 100644 index 0000000..989332c --- /dev/null +++ b/src/Doctrine/CarbonDateTimeType.php @@ -0,0 +1,47 @@ +tz('UTC'); + } + + return parent::convertToDatabaseValue($value, $platform); + } + + public function convertToPHPValue($value, AbstractPlatform $platform) + { + if (null === $value || $value instanceof Carbon) { + return $value; + } + + $converted = Carbon::createFromFormat( + $platform->getDateTimeFormatString(), + $value, + 'UTC' + ); + + if (!$converted) { + throw ConversionException::conversionFailedFormat( + $value, + $this->getName(), + $platform->getDateTimeFormatString() + ); + } + + return $converted; + } +} diff --git a/src/Provider/Database/GenericScheduleRepository.php b/src/Provider/Database/GenericScheduleRepository.php index cc43690..9d09acc 100644 --- a/src/Provider/Database/GenericScheduleRepository.php +++ b/src/Provider/Database/GenericScheduleRepository.php @@ -20,7 +20,7 @@ class GenericScheduleRepository extends DatabaseRepository implements ScheduleRe { public function getDeparturesForStop( Stop $stop, - \DateTime $from, + Carbon $from, int $count = ScheduleRepository::DEFAULT_DEPARTURES_COUNT ): Collection { $query = $this->em diff --git a/src/Provider/ScheduleRepository.php b/src/Provider/ScheduleRepository.php index 0e60468..554d9e5 100644 --- a/src/Provider/ScheduleRepository.php +++ b/src/Provider/ScheduleRepository.php @@ -3,6 +3,7 @@ namespace App\Provider; use App\Model\Stop; +use Carbon\Carbon; use Tightenco\Collect\Support\Collection; interface ScheduleRepository @@ -11,7 +12,7 @@ interface ScheduleRepository public function getDeparturesForStop( Stop $stop, - \DateTime $from, + Carbon $from, int $count = ScheduleRepository::DEFAULT_DEPARTURES_COUNT ): Collection; } diff --git a/src/Provider/ZtmGdansk/ZtmGdanskDepartureRepository.php b/src/Provider/ZtmGdansk/ZtmGdanskDepartureRepository.php index 9f5530b..7884899 100644 --- a/src/Provider/ZtmGdansk/ZtmGdanskDepartureRepository.php +++ b/src/Provider/ZtmGdansk/ZtmGdanskDepartureRepository.php @@ -42,7 +42,7 @@ class ZtmGdanskDepartureRepository implements DepartureRepository public function getForStop(Stop $stop): Collection { $real = $this->getRealDepartures($stop); - $now = Carbon::now(); + $now = Carbon::now('UTC'); $first = $real->map(t\getter('scheduled'))->min() ?? $now; $scheduled = $this->getScheduledDepartures($stop, $first < $now ? $now : $first); @@ -60,7 +60,7 @@ class ZtmGdanskDepartureRepository implements DepartureRepository $lines = $this->lines->getManyById($lines)->keyBy(t\property('id')); return collect($estimates)->map(function ($delay) use ($stop, $lines) { - $scheduled = (new Carbon($delay['theoreticalTime'], 'Europe/Warsaw')); + $scheduled = (new Carbon($delay['theoreticalTime'], 'Europe/Warsaw'))->tz('UTC'); $estimated = (clone $scheduled)->addSeconds($delay['delayInSeconds']); return Departure::createFromArray([ @@ -85,7 +85,7 @@ class ZtmGdanskDepartureRepository implements DepartureRepository private function pair(Collection $schedule, Collection $real) { $key = function (Departure $departure) { - return sprintf("%s::%s", $departure->getScheduled()->format("H:i"), $departure->getLine()->getSymbol()); + return sprintf("%s::%s", $departure->getLine()->getSymbol(), $departure->getScheduled()->format("H:i")); }; $schedule = $schedule->keyBy($key)->all();