'object', 'properties' => [ 'id' => ['type' => 'integer', 'readonly' => true], 'timetable_id' => ['type' => 'integer', 'required' => true], 'start_utc' => ['type' => 'string', 'required' => true, 'format' => 'date-time'], 'end_utc' => ['type' => 'string', 'required' => true, 'format' => 'date-time'], ], ]; } public function __construct(int|null $id, int $timetable_id, DateTime $start_utc, DateTime $end_utc) { $this->id = $id; $this->timetable_id = $timetable_id; $this->start_utc = $start_utc; $this->end_utc = $end_utc; } public static function from_array(array $data): self { $utc = new DateTimeZone('UTC'); return new self( $data['id'] ?? null, (int) $data['timetable_id'], new DateTime($data['start_utc'], $utc), new DateTime($data['end_utc'], $utc), ); } public function to_array(): array { return [ 'id' => $this->id, 'timetable_id' => $this->timetable_id, 'start_utc' => $this->start_utc->format('Y-m-d H:i:s'), 'end_utc' => $this->end_utc->format('Y-m-d H:i:s'), ]; } }